c# - NHibernate + LINQ - 相关集合的高效工作

标签 c# linq nhibernate fluent-nhibernate linq-to-nhibernate

我对 LINQ 很陌生,但我已经知道 IQueryable 和 IEnumerable 之间的基本区别(即应用于第一个条件的条件可能由远程引擎执行,在我的例子中 - 翻译为 SQL)。

现在,我见过的所有 NHibernate 教程都使用 IList<T>供相关收藏。 我想知道有没有办法使用IQueryable相反,这样过滤会更高效。

不幸的是,如果我尝试使用IQueryable<T>作为相关集合的属性类型,它会导致错误:

Unable to cast object of type 'NHibernate.Collection.Generic.PersistentGenericBag1[....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,计数在客户端完成) related

而这个:

s.Query<PersonalDocument>().Count(x => x.Owner == personInstance && x.Type == "xx");

转换为一个不错的 SQL:

enter image description here

是否有办法像第一个那样编写 DRY LINQ 查询,同时又像第二个那样获得最佳 SQL 查询?

最佳答案

关于c# - NHibernate + LINQ - 相关集合的高效工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20317446/

相关文章:

c# - 最好只对内部的静态字段使用类或结构

c# - 如何将自定义列表类转换为json?

linq 子查询返回空值

asp.net-mvc-3 - Azure云服务部署错误: "The instance of SQL Server you attempted to connect to does not support encryption. "

NHibernate 一对一映射,非主键

c# - Sonarqube C# 扫描仪异常 : "java.lang.IllegalArgumentException: is not a valid line offset for pointer"

c# - RijndaelManaged - 设置 KeySize 属性有什么作用?

c# - 比匿名类型的通用列表更好的方法

c# - IN 查询使用 LINQ 查询 IEnumerable 项目列表

NHibernate:通过聚合根处理子集合时避免完整的内存中集合