Linq for NHibernate – 对外键进行过滤会导致额外的查找

尝试使用Linq for NHibernate并首先注意到这一点:

var list1 = (from ut in session.Linq() where ut.User.ID == 10 select ut).ToList(); 
  var list2 = session.CreateCriteria(typeof (UserThings), "ut") .Add(Expression.Eq("ut.User.ID", 10)) .List(); 

第一个查询将加入“用户”表,但第二个查询不会。 不知何故,第二个知道UserID是外键,并且它不需要执行连接来过滤。

任何人都会给你的最好的建议就是不要使用Linq2NH,除非你正在编写一个非常基本的自制应用程序。

它非常不成熟,它很慢,只支持基本查询,不支持缓存,急切加载,分组….我在放弃它之前花了6个月使用它并努力学习HQL / Criteria。

@ reach4thelasers,re:cachable和fetch模式,我以为你可以做下面的事情,不是吗?

 var uthings = session.Linq(); uthings.QueryOptions.SetCachable(true); uthings.QueryOptions.RegisterCustomAction(c => c.SetFetchMode("/UserThing/User", FetchMode.Eager)) return uthings.Where(ut => ut.User == user); 

而不是不那么美丽的RegisterCustomAction + SetFetchMode,你也可以做uthings.Expand(“用户”),但只适用于单一属性,不能组合两个扩展,直到修复NHLQ-35 。