我有个奇怪的问题。我注意到下面定义的代码:
var query= unitOfWork.Session.CreateCriteria(typeof (SomeEntity)).Future<SomeEntity>().AsQueryable();
var queryWithWhere= query.Where(x => x.SomeProperty.ToLower().Contains("Xxx".ToLower()));
var result= queryWithWhere.ToList();给出了正确的结果,但是我在NHibernateProfiler中看到的SQL查询不包含where子句,它只是
SELECT ...
FROM SomeEntity我的代码中的这个WHERE似乎是在SQL查询运行之后使用的,就像Linq-to-Objects而不是Linq-to-SQL。
当然,SQL查询是在第三行继续之后开始的。
发布于 2013-03-01 21:56:37
如果您想使用Linq,并让NHibernate理解它,那么使用CreateQuery<T>扩展( NHibernate的一部分,在NHibernate.Linq名称空间中)来直接创建一个IQueryable<T>,而不是使用CreateCriteria<T> -正如您已经注意到的,它只允许您编写NHibernate将作为约束处理的查询部分。
发布于 2013-03-01 21:34:59
如果您希望在第一个查询中包含WHERE,我认为您需要添加一个限制:
unitOfWork.Session.CreateCriteria<SomeEntity>()
.Add(Restrictions.Eq("SomeProperty", "Some Value"))干杯
编辑
或者更适合你
unitOfWork.Session.CreateCriteria<SomeEntity>()
.Add(Restrictions.InsensitiveLike("SomeProperty", "Some Value"))发布于 2013-03-02 00:08:24
由于AsQueryable()导致集合被加载并强制转换为IQueryable,NHibernate将实例化结果集。有关实体框架中的类似行为,请参见this question。
我将重写您的查询以使用NHibernate的LINQ提供程序:
var result = session.Query<SomeEntity>()
.Where(x => x.SomeProperty.ToLower().Contains("Xxx".ToLower)));https://stackoverflow.com/questions/15158871
复制相似问题