0

i には 2 つの単純なオブジェクト A と B があります。オブジェクト A にはオブジェクト B への参照があります。

public class A
{
    public virtual Guid AId { get; set; }
    public virtual string Name { get; set; }
    public virtual B BObject { get; set; }
}

public class B
{
    public virtual Guid BId { get; set; }
    public virtual string Name { get; set; }
}

これら 2 つのオブジェクトを Fluent-NHibernate でマッピングしました。

public class AMap : ClassMap<A>
{
    public AMap()
    {
        Id(x => x.AId);
        Map(x => x.Name);
        References<B>(x => x.BObject);
    }
}

public class BMap : ClassMap<B>
{
    public BMap()
    {
        Id(x => x.BId);
        Map(x => x.Name);
    }
}

データベースを作成した後、2 つのテーブルを取得します。A のテーブルには、追加の列「BObject_id」があります。

参照されるオブジェクト B の ID のみを選択する必要がある特殊なケースがあります。LINQ を使用してこれを選択します。

var test = session.Query<A>().Select(x => x.BObject.BId);

これにより、SQLクエリが生成されます(私はMSSQL2012を使用しています):

select b1_.BId as col_0_0_ from iadb.[A] a0_ left outer join iadb.[B] b1_ on a0_.BObject_id=b1_.BId

Hibernate は最初に 2 つのテーブルを結合し、次に B のキー列を選択します

私の質問は:

テーブルAからカラム「BOject_id」の値だけを選択することはできますか?

この特殊なケースでは結合を避け、他のケースでは参照の利点を利用したいと考えています。

4

2 に答える 2

1

readonlyプロパティAを使用して C# クラスを拡張できます。 BId

public class A
{
    public virtual Guid AId { get; set; }
    public virtual string Name { get; set; }
    public virtual B BObject { get; set; }
    public virtual Guid BId { get; set; } // virtual "navigational" property
}

readonlyとしてマップします。参照 BObject と同じ列をターゲットにするため、これは重要です。

public AMap()
{
  Id(x => x.AId);
  Map(x => x.Name);
  References<B>(x => x.BObject)
    .Column("BOject_id");
  Map(x => x.BId)
    .Column("BOject_id") // the same column names
    .ReadOnly();
}

これで、結合なしで取得できます。

var test = session.Query<A>().Select(x => x.BId);
于 2013-01-15T10:45:25.457 に答える
0

これを試しましたか:

var test = session.Query<A>().Select(x => x.BObject).Select(x => x.BId);

この場合、NHibernate は結合なしで B のプロキシを作成する必要があり、作成されたプロキシの識別子のみにアクセスして DB アクセスをトリガーしないようにする必要があります。

于 2013-04-04T08:04:45.807 に答える