2012-09-18 53 views
1

我使用Fluent-Nhibernate版本1.3,并试图使查询包含5个表。我创建了一个Oracle数据库的SQL查询,我试图用linq-to-nhibernate进行复制。Linq-to-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; } 
} 

我的映射:

class AMap : ClassMap<A> 
{ 
    public AMap() 
    { 
     Table("A"); 

     Id(x => x.idA, "ID_A").GeneratedBy.Sequence("StringA"); 
     Map(x => x.tipoA, "TP_A"); 
     Map(x => x.codA, "CODE_A"); 
     HasMany(x => x.listB).Cascade.All().KeyColumn("ID_A"); 
    } 
} 

class BMap : ClassMap<B> 
{ 
    public BMap() 
    { 
     Table("B"); 

     CompositeId() 
      .KeyReference(x => x.objectC, "ID_C") 
      .KeyReference(x => x.objectA, "ID_A") 
      .KeyProperty(x => x.dtBegin, "DT_BEGIN"); 

     Map(x => x.dtEnd, "DT_END"); 
    } 
} 

class CMap : ClassMap<C> 
{ 
    public CMap() 
    { 
     Table("C"); 
     Id(x => x.idC, "ID_C").GeneratedBy.Sequence("StringC"); 
     Map(x => x.codeC, "CODE_C"); 
     HasMany(x => x.listB).Cascade.All().KeyColumn("ID_C"); 
     HasMany(x => x.listD).Cascade.All().KeyColumn("ID_D"); 
    } 
} 

class DMap : ClassMap<D> 
{ 
    public DMap() 
    { 
     Table("D"); 

     CompositeId() 
      .KeyReference(x => x.objectC, "ID_C") 
      .KeyProperty(x => x.flgD, "FLG_D") 
      .KeyProperty(x => x.dtBegin, "DT_BEGIN"); 
     References(x => x.objectE, "CODE_E"); 
     Map(x => x.dtEnd, "DT_END"); 
    }  
} 

class EMap : ClassMap<E> 
{ 
    public EMap() 
    { 
     Table("E"); 

     Id(i => i.idE, "ID_E").GeneratedBy.Assigned(); 
     Map(m => m.dsE, "DSC_E"); 
     Map(m => m.dtBegin, "DT_BEGIN"); 
     Map(m => m.dtEnd, "DT_END"); 
     HasMany(x => x.listD).Cascade.All().KeyColumn("ID_E"); 
    } 
} 

我的SQL查询(它的工作原理):

SELECT C.CODE_C, E.CODE_E, E.DT_BEGIN 
FROM TABLEA A, TABLEB B, TABLEC C, TABLED D, TABLEE E 
WHERE A.CODE_A = '0000' AND A.ID_A = B.ID_A AND B.ID_C = C.ID_C AND B.DT_END IS NULL 
AND C.ID_C = D.ID_C AND D.DT_END IS NULL AND D.CODE_E = E.CODE_E AND E.DT_END IS NULL; 

我尝试使用多个连接,但随后一些relathionship是集合所以我将不得不在联合内部做出一个地方。

所以我的问题是:有可能使这个相同的SQL查询作为linq-to-nhibernate或更好地做出一个选择序列?不,我不能改变数据库。

在此先感谢。

+0

如果我读这一权利, A> B是很多对B> C是一对多,C> D是多对一,D> E是多对一。我有没有得到那个权利? – Bytemaster

+0

嗨Bytemaster A> B oneToMany。 –

回答

1

是空查询是唯一可能使用DateTime?类型

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(); 
+0

对不起Firo,我没有理解你的问题。我试过你的方式,但是当我从b中的c进入时,出现以下错误:“类型为'DataAcess.Oracle.DB.Entity.C'的表达式在源类型为查询表达式的后续from子句中不允许'System.Linq.IQueryable '。在对SelectMany的调用中输入推断失败“。我尝试了多个查询,但“var query =(从一个在session.Query ()其中a.codeA =='0000'选择a).First();”给我所有的信息,除了它带来的一切,不受其他实体的位置限制。 –

+0

它只是需要将**从c在bC **更改为**让c = bC **像这样的帖子:http://stackoverflow.com/questions/6049155/type-in​​ference-failed-in-the-call -to-的SelectMany。它的工作!感谢Firo。 –

+0

只是一件事。在“选择新{”我想只得到一个Ccode = c.Code和一个数组或列表}我可以这样做吗?因为cCode总是一样的。 –