1

クエリのリストに重複した結果があるという問題があります。

私が持っているのはFetchMany、リポジトリのメソッドに関する2 つです。

    public IQueryable<MyEntity> Query()
    {
        return Session.Query<MyEntity>()
            .FetchMany(x => x.ListA)
            .FetchMany(x => x.ListB);
    }

クエリ:

var result = _myEntityRepository
    .Query()
    .Where(x => names.Contains(x.Name))
    .Where(x => x.ListA.Any(m => listAIds.Contains(m.Id)))
    .Where(x => x.ListB.Any(m => listBIds.Contains(m.Id)))
    .OrderBy(x => x.CreationDate)
    .ToList();

マッピング:

        HasManyToMany(x => x.ListA)
            .Table("MY_ENTITY_TYPE_A")
            .ParentKeyColumn("MYENTITY_ID")
            .ChildKeyColumn("MYENTITYA_ID")
            .Fetch.Join();

ListAいくつかのプロパティを持つクラス MyEntityA です。

ListBいくつかのプロパティを持つクラス MyEntityB です。

生成された SQL は良好で、必要な値を取得しますが、値が追加されてListAListB度か複製されます。ListA と ListB は別々のテーブルです (多対多)。

私は使用しますfluent-nhibernate

私は使用して調べましたToFutureが、それは私に与えられただけMethod Not Implemented Exceptionで、リポジトリの外でNHibernateを使用したくありません。

これが私が試したものです:

    public IQueryable<MyEntity> Query()
    {
        var query = Session.Query<MyEntity>();

        Session.Query<MyEntity>().FetchMany(x => x.ListA).ToFuture();
        Session.Query<MyEntity>().FetchMany(x => x.ListB).ToFuture();

        return query;
    }

次の場所で例外がスローされます。

        Session.Query<MyEntity>().FetchMany(x => x.ListA).ToFuture();

TargetInvocationException内部例外「メソッドまたは操作が実装されていません」でスローされます。

スタックトレース:

   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
   at NHibernate.Linq.DefaultQueryProvider.ExecuteFutureQuery(NhLinqExpression nhLinqExpression, IQuery query, NhLinqExpression nhQuery)
   at NHibernate.Linq.DefaultQueryProvider.ExecuteFuture(Expression expression)
   at NHibernate.Linq.LinqExtensionMethods.ToFuture[T](IQueryable`1 query)

どうすればこれを達成できますか? 現時点ではDisctintListA と ListB で行っていますが、作成されたエンティティ内のすべての重複した値が遅く、あまり良くないようです。

MyEntity には、ListA に EntityA のアイテムが多数あり、ListB に EntityB のアイテムが多数ありますが、データベースに重複はありません。

注: 両方に FetchMany を使用する必要があります。そうしないと、選択クエリが多すぎます。

4

1 に答える 1

1

仕事ToFutureに行くことが重要になります。 x.ListAXx.ListBはデカルト積です。 ToFuture動作するはずです。それを使用しようとしたことについて、詳細を教えていただけますか?

デカルト積を無視すると、現在のアプローチを機能させる<set/>こと<bag/>ができます。これにより、コレクションに重複が含まれてはならないことが NHibernate に通知されます。通常、これは必要ありませんが、同じクエリにとの両方を含めると、重複した結果が作成されます。 これを修正する必要があります。ListAListBListAListB<set/>

于 2013-09-03T17:25:41.640 に答える