在我们的应用程序中,我们使用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>();
}在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>();
}我们有一个扩展方法来添加急切的加载:
/// <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编写查询。
发布于 2016-04-01 19:04:55
在NHibernate 4中,我们已经在库上将Linq作为本机支持。
您可以使用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,它有点冗长(在我看来),但是在数据库上定义您的QueryOver语句非常灵活。
发布于 2016-04-01 19:03:45
从NH3 (我相信)开始,您将使用.Fetch、.FetchMany、.ThenFetch和.ThenFetchMany扩展来加载实体。
下面是我如何使用这个方法的一个例子:
Order order = orderRepository.Query().Where(x => x.Id == orderId)
.FetchMany(x => x.OrderLines)
.ThenFetchMany(y => y.SubLines)
.ToList()https://stackoverflow.com/questions/36353464
复制相似问题