首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用NHibernate填充实体中的引用?不再是INHibernateQueryable

如何用NHibernate填充实体中的引用?不再是INHibernateQueryable
EN

Stack Overflow用户
提问于 2016-04-01 10:04:27
回答 2查看 573关注 0票数 0

在我们的应用程序中,我们使用NH2和NHibernate.Linq。我们想升级到最新的版本!

因此,我已经读到,自从NH3之后,Linq功能就“不相关”到了NH程序集中。

现在,我已经安装了NH4,但是我们的代码库也必须升级。

在我们的NH2实现中,我们使用:

代码语言:javascript
复制
    /// <summary>
    /// Gets an <see cref="IQueryable{T}"/> of entities.
    /// </summary>
    /// <returns>An <see cref="IQueryable{T}"/> of entities.</returns>
    public virtual IQueryable<T> GetQueryable() {
        return this.Session.Linq<T>();
    }

在NH4中,这是/威尔/必须是:

代码语言:javascript
复制
    /// <summary>
    /// Gets an <see cref="IQueryable{T}"/> of entities.
    /// </summary>
    /// <returns>An <see cref="IQueryable{T}"/> of entities.</returns>
    public virtual IQueryable<T> GetQueryable() {
        return this.Session.Query<T>();
    }

我们有一个扩展方法来添加急切的加载:

代码语言:javascript
复制
    /// <summary>
    /// Adds eager-loading for <paramref name="alias"/>.
    /// </summary>
    /// <typeparam name="T">Queryable type.</typeparam>
    /// <param name="source">A queryable.</param>
    /// <param name="alias">An expression that tells what to eager load.</param>
    /// <returns>A queryable.</returns>
    public static IQueryable<T> Expand<T>(this IQueryable<T> source, Expression<Func<T, object>> alias)
    {
        var nhQueryable = source as INHibernateQueryable;
        if (nhQueryable != null)
        {
            nhQueryable.QueryOptions.AddExpansion(ExpressionProcessor.FindMemberExpression(alias.Body));
        }
        return source;
    }

在NH4 (.Linq)中,已经没有INHibernateQueryable了,但是我如何转换这段代码,使其像以前那样与NHibernate 4一起工作呢?

我们使用Linq编写查询。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-01 19:04:55

在NHibernate 4中,我们已经在库上将Linq作为本机支持。

您可以使用FetchFechtManyThenFetchThenFetchMany,这将涵盖查询实体和聚合根之间关系的一些可能性。样本:

代码语言:javascript
复制
var customers = session.Query<Customer>()
                       .Fetch(x => x.City)
                       .ThenFetch(x => x.State)
                       .ToList();

FetchThenFetch只填写实体上的引用,FetchManyThenFetchMany填充实体集合。

在NHibernate 3中,我们还有一个QueryOver,它有点冗长(在我看来),但是在数据库上定义您的QueryOver语句非常灵活。

票数 1
EN

Stack Overflow用户

发布于 2016-04-01 19:03:45

从NH3 (我相信)开始,您将使用.Fetch.FetchMany.ThenFetch.ThenFetchMany扩展来加载实体。

下面是我如何使用这个方法的一个例子:

代码语言:javascript
复制
Order order = orderRepository.Query().Where(x => x.Id == orderId)
                        .FetchMany(x => x.OrderLines)
                        .ThenFetchMany(y => y.SubLines)
                        .ToList()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36353464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档