クエリのリストに重複した結果があるという問題があります。
私が持っているのは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 は良好で、必要な値を取得しますが、値が追加されてListA
何ListB
度か複製されます。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)
どうすればこれを達成できますか? 現時点ではDisctint
ListA と ListB で行っていますが、作成されたエンティティ内のすべての重複した値が遅く、あまり良くないようです。
MyEntity には、ListA に EntityA のアイテムが多数あり、ListB に EntityB のアイテムが多数ありますが、データベースに重複はありません。
注: 両方に FetchMany を使用する必要があります。そうしないと、選択クエリが多すぎます。