nhibernate - Finding the row with matching relations using HQL -
i using castle activerecord , nhibernate.
i have instance class has many-to-many relationship component class. find instance related specific set of components. possible in hql (or else in nhibernate)?
the linq version of function be:
public instance find(ienumerable<component> passed_components) { return instance.queryable.single(i => passed_components.all(x => i.components.contains(x))); }
of course nhibernate linq implementation can't handle this.
i can write hql 1 of components:
instance.findone(new detachedquery("from instance :comp in elements(i.components)").setparameter("comp", passed_components.first()));
but looks in compares 1 item set, can't compare set set.
edit:
this best do:
iqueryable<instance> q = queryable; foreach(var c in components) { q = q.where(i => i.components.contains(c)); }
but inefficient. adds subselect sql query every clause. unnecissarily long subselect @ that. joins instance table, instance/component join table, , component table. needs instance/component join table.
because of nature of data, going implement hybrid solution. narrow down instances in query, use linq objects correct 1 if necessary. code looks this:
iqueryable<instance> q = queryable; foreach(var c in components.take(2)) { q = q.where(i => i.components.contains(c)); } var result = q.toarray(); if(result.length > 1) { return result.singleordefault(i => !components.except(i.components).any()); } else return result.firstordefault();
anyone have better way?
using nhibernate.linq provider, following should work:
var passed_components = new list<component>(); var instance = session.linq<instance>() .where(i => !passed_components.except(i.components).any()) .singleordefault();
Comments
Post a Comment