0

予想よりも多くの結果を返す単純なNhibernateLinqクエリがあります。

  var result = (from foo in session.Linq<Foo>()
                      where foo.High.ID == High.ID
                      select foo).ToArray();

Fooは次のようになります。

public class Foo : DomainLayerSuperType
{
  // ...other members omitted for clarity
  protected IList<Bar> associatedBars;

}

私の問題は、「associatedBars」コレクション内のすべてのバーに対して重複したFooを取得することです。したがって、Fooのインスタンスのコレクションに20個のバーがある場合、それぞれ20個のバーを持つ20個のFooインスタンスを取得します。

Fooのマッピング:(FluentNhibernate)

//other mappings omitted
HasMany<Bar>(x => x.AssociatedBars)
                .Access.CamelCaseField()
                .AsBag()
                .Table("dbo.Bar")
                .KeyColumn("FooID")
                .Cascade.AllDeleteOrphan()
                .Inverse()
                .Fetch.Join(); //eager load

この同等のHqlクエリを実行しても、問題は発生しません。

var query = new StringBuilder();
query.AppendFormat("select foo from Foo foo where foo.High.ID = {0}", High.ID);
var result = session.CreateQuery(query.ToString()).List<Foo>().ToArray();

また、Fooのマッピングを変更して、AssociatedBarsの遅延読み込みを使用しても、問題は発生しません。

何か案は?また、Nh Linqの最高のフォーラムはどこですか?見つからなかったのでここに投稿しました!

4

1 に答える 1

3

問題は、現在の linq プロバイダーが条件クエリに基づいていることです。マッピングで Fetch.Join プロパティを設定している場合、生成された SQL クエリをチェックすると、そこに結合が表示されます。この結合により、繰り返し結果が得られます。

HQL では、NHibernate は sql クエリを生成するために異なる方法を使用し、sql は HQL と非常に似ています。そのため、結合も繰り返し列もありません。

liq クエリの場合、クエリから一意の結果のみを取得するために Distinct extension を使用できます。

HQL パーサーに基づいて linq プロバイダーを作成するプロジェクトが現在開発中です。

于 2009-11-09T10:58:06.757 に答える