我对 LINQ 很陌生,但我已经知道 IQueryable 和 IEnumerable 之间的基本区别(即应用于第一个条件的条件可能由远程引擎执行,在我的例子中 - 翻译为 SQL)。
现在,我见过的所有 NHibernate 教程都使用 IList<T>
供相关收藏。
我想知道有没有办法使用IQueryable
相反,这样过滤会更高效。
不幸的是,如果我尝试使用IQueryable<T>
作为相关集合的属性类型,它会导致错误:
Unable to cast object of type 'NHibernate.Collection.Generic.PersistentGenericBag
1[....PersonalDocument]' to type 'System.Linq.IQueryable
因此,为了保持 SQL 端相关集合的过滤,我需要直接查询相关类型,提供“绑定(bind)”关系的额外条件。这是非常不方便的,我想避免这种情况(因为关系条件已经声明了......)
澄清一下:
我有两个模型,如下:
public partial class Person
{
public virtual int Id { get; set; }
// ....
public virtual IEnumerable<PersonalDocument> Documents { get; set; }
}
public class PersonalDocument
{
// ...
public virtual int Id { get; set; }
public virtual Person Owner { get; set; }
public virtual string Type { get; set; }
}
以及 Person
的映射代码:
HasMany<DomainModel.PersonalDocument>(x => x.Documents)
.KeyColumn("Owner_Id")
.Inverse()
.Cascade.Delete()
.AsBag();
和查询代码
personInstance.Documents.Where(d => d.Type == "xx").Count()
正在转换为非最佳 SQL(没有“类型”过滤器应用于 SQL,计数在客户端完成)
而这个:
s.Query<PersonalDocument>().Count(x => x.Owner == personInstance && x.Type == "xx");
转换为一个不错的 SQL:
是否有办法像第一个那样编写 DRY LINQ 查询,同时又像第二个那样获得最佳 SQL 查询?
最佳答案
NHibernate核心中没有这样的功能。
参见https://nhibernate.jira.com/browse/NH-2319和 http://www.nuget.org/packages/NHibernate.CollectionQuery .
关于c# - NHibernate + LINQ - 相关集合的高效工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20317446/