Join Linq到Nhibernate带条件的多重连接

Join Linq到Nhibernate带条件的多重连接,join,fluent-nhibernate,linq-to-nhibernate,Join,Fluent Nhibernate,Linq To Nhibernate,我使用的是Fluent Nhibernate 1.3版,我试图在5个表中进行查询。我为oracle数据库创建了一个sql查询,并尝试使用linq复制到nhibernate 下面是我的实体和映射示例 实体: public class A { public virtual int idA { get; set; } public virtual String codA { get; set; } public virtual String tipoA { get; set;

我使用的是Fluent Nhibernate 1.3版,我试图在5个表中进行查询。我为oracle数据库创建了一个sql查询,并尝试使用linq复制到nhibernate

下面是我的实体和映射示例

实体:

public class A
{
    public virtual int idA { get; set; }
    public virtual String codA { get; set; }
    public virtual String tipoA { get; set; }
    public virtual IList<B> listB { get; set; }
}

public class B
{
    public virtual C objectC { get; set; }
    public virtual A objectA { get; set; }
    public virtual DateTime dtBegin { get; set; }
    public virtual DateTime dtEnd { get; set; }
}

public class C
{
    public virtual int idC { get; set; }
    public virtual String codeC { get; set; }
    public virtual IList<B> listB { get; set; }
    public virtual IList<D> listD { get; set; }
}

public class D
{
    public virtual C objectC { get; set; }
    public virtual string flgD { get; set; }
    public virtual DateTime dtBegin { get; set; }
    public virtual DateTime dtEnd { get; set; }
    public virtual E objectE { get; set; }
}

public class E
{
    public virtual int idE { get; set; }
    public virtual String dsE { get; set; }
    public virtual DateTime dtBegin { get; set; }
    public virtual DateTime dtEnd { get; set; }
    public virtual IList<D> listD { get; set; }
}
我尝试使用多个连接,但是一些relaship是集合,所以我必须在连接内部创建一个where

所以我的问题是:是否可以进行与linq到nhibernate相同的Sql查询,或者最好进行一系列选择?不,我不能改变数据库


提前感谢。

只有使用DateTime才能执行is null查询?as类型

var query = from b in B
            from c in b.C
            from d in c.listD
            from e in d.E
            where b.A.Code == "0000" && b.EndDate == null & ...
            select new { Ccode = c.Code, Ecode = e.Code, E_BeginDate = e.BeginDate }
更新:回答第三条评论

必须在内存中对结果进行分组,因为sql中的分组只能返回聚合

var results = query.AsEnumerable()
    .GroupBy(a => a.Ccode, a => a.Ecode, (key, values) => new { Ccode = Key, Ecodes = values.ToList() })
    .List();

is null查询只能使用DateTime?as类型

var query = from b in B
            from c in b.C
            from d in c.listD
            from e in d.E
            where b.A.Code == "0000" && b.EndDate == null & ...
            select new { Ccode = c.Code, Ecode = e.Code, E_BeginDate = e.BeginDate }
更新:回答第三条评论

必须在内存中对结果进行分组,因为sql中的分组只能返回聚合

var results = query.AsEnumerable()
    .GroupBy(a => a.Ccode, a => a.Ecode, (key, values) => new { Ccode = Key, Ecodes = values.ToList() })
    .List();

如果我读对了,A>B是多对多,eb>C是一对多,C>D是多对一,D>e是多对一。我说得对吗?嗨,B老师A>B一对一。如果我读得对的话,A>B是多对多。e>B>C是一对多,C>D是多对一,D>e是多对一。我说得对吗?你好,我是一位老师。对不起,菲罗,我不明白你的问题。我尝试了你的方法,但当我从b.c中的c进入时,我得到了以下错误:“源类型为“System.Linq.IQueryable”的查询表达式中的后续from子句中不允许使用类型为“DataAcess.Oracle.DB.Entity.c”的表达式。调用SelectMany时类型推断失败”。我尝试了多个查询,但“var query=(从会话中的a.query()中,其中a.codeA='0000'选择a)。First();”提供了所有信息,除了带来所有信息之外,不受来自其他实体的where的限制。只需将b.c中的c更改为让c=b.c,如本文所示:。成功了!谢谢,菲罗。还有一件事。在“selectnew{”中,我只想得到一个Ccode=c.Code和一个数组或列表},我可以这样做吗?因为代码总是一样的。对不起,菲罗,我不明白你的问题。我尝试了你的方法,但当我从b.c中的c进入时,我得到了以下错误:“源类型为“System.Linq.IQueryable”的查询表达式中的后续from子句中不允许使用类型为“DataAcess.Oracle.DB.Entity.c”的表达式。调用SelectMany时类型推断失败”。我尝试了多个查询,但“var query=(从会话中的a.query()中,其中a.codeA='0000'选择a)。First();”提供了所有信息,除了带来所有信息之外,不受来自其他实体的where的限制。只需将b.c中的c更改为让c=b.c,如本文所示:。成功了!谢谢,菲罗。还有一件事。在“selectnew{”中,我只想得到一个Ccode=c.Code和一个数组或列表},我可以这样做吗?因为代码总是一样的。