1

我的查询列表中出现重复结果的问题。

我有两个FetchMany关于我的存储库的方法:

    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,否则选择查询会太多!

4

1 回答 1

1

开始ToFuture工作将很重要。 x.ListAXx.ListB是笛卡尔积。 ToFuture应该管用。你能提供更多关于你尝试使用它的细节吗?

忽略笛卡尔积,您可以使用<set/>而不是<bag/>when 映射ListAListB. 这告诉 NHibernate 集合不应包含重复项。通常这不是必需的,但是在同一个查询中包含两者ListAListB创建重复的结果。 <set/>应该解决这个问题。

于 2013-09-03T17:25:41.640 回答