繁体   English   中英

NHibernate fetchmany重复值存储库模式

[英]NHibernate fetchmany duplicated values repository pattern

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

我的存储库方法上有两个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很好并且可以获取我需要的值,添加到ListAListB的值要重复几次。 ListA和ListB是单独的表(很多)。

我使用fluent-nhibernate

我使用ToFuture进行了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();

引发TargetInvocationExceptionTargetInvocationException内部异常“未实现方法或操作”。

堆栈跟踪:

   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上利斯塔和数组listB,但它似乎要慢一些,不那么好,在创建的实体所有的重复值。

MyEntity在ListA中有许多EntityA项目,在ListB中有许多EntityB项目,但是数据库中没有重复项。

注意:我必须同时使用FetchMany,否则选择查询会太多!

使ToFuture正常工作将很重要。 x.ListA X x.ListB是笛卡尔积。 ToFuture应该工作。 您能否提供有关使用它的更多详细信息?

忽略笛卡尔积,在映射ListAListB时,可以使用<set/>而不是<bag/>来获得当前的工作方法。 这告诉NHibernate集合不应该包含重复项。 通常这不是必需的,但是在同一查询中同时包含ListAListB会创建重复的结果。 <set/>应该解决此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM