1

Fluent-Nhibernateバージョン1.3を使用しており、5つのテーブルを含むクエリを作成しようとしています。OracleデータベースのSQLクエリを作成し、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;

複数の結合を使用しようとしましたが、一部の関係はコレクションであるため、結合内の場所を作成する必要があります。

だから私の質問は:これをlinq-to-nhibernateと同じSQLクエリにすることは可能ですか、それとも一連の選択を行う方が良いですか?そして、私はデータベースを変更することはできません。

前もって感謝します。

4

1 に答える 1

1

nullクエリは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 }

更新:3番目のコメントに答える

grouping the results has to be done in memory because grouping in sql can only return aggregations

var results = query.AsEnumerable()
    .GroupBy(a => a.Ccode, a => a.Ecode, (key, values) => new { Ccode = Key, Ecodes = values.ToList() })
    .List();
于 2012-09-19T13:55:12.560 に答える