C# 如何用NHibernate填充实体中的引用?不再是天然的

C# 如何用NHibernate填充实体中的引用?不再是天然的,c#,linq,nhibernate,linq-to-nhibernate,C#,Linq,Nhibernate,Linq To Nhibernate,在我们的应用程序中,我们将NH2与NHibernate.Linq一起使用。我们想升级到最新版本 所以我已经读到,自从NH3之后,Linq功能被“集成”到NH组件中 现在;我已经安装了NH4,但我们的代码库也必须升级 在我们的NH2实施中,我们使用了: /// <summary> /// Gets an <see cref="IQueryable{T}"/> of entities. /// </summary> /// <

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

所以我已经读到,自从NH3之后,Linq功能被“集成”到NH组件中

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

在我们的NH2实施中,我们使用了:

    /// <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>();
    }
//
///获取实体的名称。
/// 
///实体的集合。
公共虚拟IQueryable GetQueryable(){
返回此.Session.Linq();
}
在NH4中,这是/将是/必须是:

    /// <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>();
    }
//
///获取实体的名称。
/// 
///实体的集合。
公共虚拟IQueryable GetQueryable(){
返回此.Session.Query();
}
我们有一个扩展方法来添加即时加载:

    /// <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;
    }
//
///添加了对数据的快速加载。
/// 
///可查询类型。
///可质问的人。
///表示要加载的内容的表达式。
///可质问的人。
公共静态IQueryable扩展(此IQueryable源,表达式别名)
{
var nhQueryable=源为INHibernateQueryable;
如果(nhQueryable!=null)
{
nhQueryable.QueryOptions.AddExpansion(ExpressionProcessor.FindMemberExpression(alias.Body));
}
返回源;
}
在NH4(.Linq)中,不再有
INHibernateQueryable
,但如何转换此代码,使其与NHibernate4一起工作,就像以前一样

我们正在使用Linq来编写查询。

从NH3开始(我相信),您现在将使用
.Fetch
.FetchMany
。然后Fetch
。然后FetchMany
扩展来快速加载实体

以下是我如何使用此功能的示例:

Order order = orderRepository.Query().Where(x => x.Id == orderId)
                        .FetchMany(x => x.OrderLines)
                        .ThenFetchMany(y => y.SubLines)
                        .ToList()
从NH3开始(我相信),您现在将使用
.Fetch
.FetchMany
。然后Fetch
。然后FetchMany
扩展来快速加载实体

以下是我如何使用此功能的示例:

Order order = orderRepository.Query().Where(x => x.Id == orderId)
                        .FetchMany(x => x.OrderLines)
                        .ThenFetchMany(y => y.SubLines)
                        .ToList()

在NHibernate4中,我们已经将Linq作为lib的本机支持

您可以使用
Fetch
fechmany
ThenFetch
ThenFetchMany
,这将涵盖查询实体和聚合根之间关系的一些可能性。对于示例:

var customers = session.Query<Customer>()
                       .Fetch(x => x.City)
                       .ThenFetch(x => x.State)
                       .ToList();
var customers=session.Query()
.Fetch(x=>x.City)
.ThenFetch(x=>x.State)
.ToList();
Fetch
然后Fetch
只需填写一个实体上的引用,然后
FetchMany
然后FetchMany
填写一个实体集合


在NHibernate 3中,我们还有
QueryOver
,这有点冗长(在我看来),但在数据库上定义sql语句非常灵活

在NHibernate 4中,我们已经将Linq作为lib的本机支持

您可以使用
Fetch
fechmany
ThenFetch
ThenFetchMany
,这将涵盖查询实体和聚合根之间关系的一些可能性。对于示例:

var customers = session.Query<Customer>()
                       .Fetch(x => x.City)
                       .ThenFetch(x => x.State)
                       .ToList();
var customers=session.Query()
.Fetch(x=>x.City)
.ThenFetch(x=>x.State)
.ToList();
Fetch
然后Fetch
只需填写一个实体上的引用,然后
FetchMany
然后FetchMany
填写一个实体集合


在NHibernate 3中,我们还有
QueryOver
,这有点冗长(在我看来),但在数据库上定义sql语句非常灵活

如果有人找不到这些扩展,请使用NHibernate.Linq添加
。它们来自于这个名称空间,就像。如果任何人都找不到这些扩展,请使用NHibernate.Linq添加一个
。他们来自那个名字空间,谢谢!最后,我决定选择
QueryOver
,因为它可以让我更好地在根对象+结果转换上用几个子元素链接
Fetch
。除此之外,编写:迁移过程的扩展方法更简单,只需基于类型
IQueryOver
谢谢!最后,我决定选择
QueryOver
,因为它可以让我更好地在根对象+结果转换上用几个子元素链接
Fetch
。除此之外,编写:迁移过程的扩展方法更容易,只需基于类型
IQueryOver