如何使用 NHibernate 填充实体中的引用?不再有 INHibernateQueryable
How fill references in entity with NHibernate? No more INHibernateQueryable
在我们的应用程序中,我们将 NH2 与 NHibernate.Linq 一起使用。我们要升级到最新版本!
所以我读到,自 NH3 以来,Linq 功能 'incorperated' 进入了 NH 程序集。
现在;我有 NH4 'installed' 但我们的代码库也必须升级。
在我们的 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>();
}
在 NH4 中这个 is/will/must 是:
/// <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>();
}
我们有一个扩展方法来添加预先加载:
/// <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 编写查询。
从 NH3 开始(我相信)您现在可以使用 .Fetch
、.FetchMany
、.ThenFetch
和 .ThenFetchMany
扩展来预加载实体。
这是我如何使用它的示例:
Order order = orderRepository.Query().Where(x => x.Id == orderId)
.FetchMany(x => x.OrderLines)
.ThenFetchMany(y => y.SubLines)
.ToList()
在 NHibernate 4 中,我们已经将 Linq 作为 lib 的本机支持。
您可以使用 Fetch
、FechtMany
、ThenFetch
和 ThenFetchMany
,这将涵盖查询实体和聚合根之间关系的一些可能性。例如:
var customers = session.Query<Customer>()
.Fetch(x => x.City)
.ThenFetch(x => x.State)
.ToList();
Fetch
和 ThenFetch
仅填写您可以在实体上拥有的引用,FetchMany
和 ThenFetchMany
填写实体集合。
在 NHibernate 3 中,我们也有 QueryOver
,它有点冗长(在我看来),但是在数据库上定义 sql 语句非常灵活。
在我们的应用程序中,我们将 NH2 与 NHibernate.Linq 一起使用。我们要升级到最新版本!
所以我读到,自 NH3 以来,Linq 功能 'incorperated' 进入了 NH 程序集。
现在;我有 NH4 'installed' 但我们的代码库也必须升级。
在我们的 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>();
}
在 NH4 中这个 is/will/must 是:
/// <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>();
}
我们有一个扩展方法来添加预先加载:
/// <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 编写查询。
从 NH3 开始(我相信)您现在可以使用 .Fetch
、.FetchMany
、.ThenFetch
和 .ThenFetchMany
扩展来预加载实体。
这是我如何使用它的示例:
Order order = orderRepository.Query().Where(x => x.Id == orderId)
.FetchMany(x => x.OrderLines)
.ThenFetchMany(y => y.SubLines)
.ToList()
在 NHibernate 4 中,我们已经将 Linq 作为 lib 的本机支持。
您可以使用 Fetch
、FechtMany
、ThenFetch
和 ThenFetchMany
,这将涵盖查询实体和聚合根之间关系的一些可能性。例如:
var customers = session.Query<Customer>()
.Fetch(x => x.City)
.ThenFetch(x => x.State)
.ToList();
Fetch
和 ThenFetch
仅填写您可以在实体上拥有的引用,FetchMany
和 ThenFetchMany
填写实体集合。
在 NHibernate 3 中,我们也有 QueryOver
,它有点冗长(在我看来),但是在数据库上定义 sql 语句非常灵活。