我有一个奇怪的问题。我注意到下面定义的代码:
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查询是在第三行继续之后启动的。
答案 0 :(得分:2)
如果你想使用Linq,而NHibernate要理解它,那么使用CreateQuery<T>
扩展名(NHibernate的一部分,在NHibernate.Linq
命名空间中)直接创建一个IQueryable<T>
,而不是CreateCriteria<T>
- 正如您所注意到的那样,只允许您编写NHibernate将作为限制处理的查询部分。
答案 1 :(得分:1)
如果你想在第一个查询中使用WHERE,我认为你需要添加一个限制:
unitOfWork.Session.CreateCriteria<SomeEntity>()
.Add(Restrictions.Eq("SomeProperty", "Some Value"))
干杯
修改强>
或者更适合你
unitOfWork.Session.CreateCriteria<SomeEntity>()
.Add(Restrictions.InsensitiveLike("SomeProperty", "Some Value"))
答案 2 :(得分:0)
NHibernate正在实现结果集,因为AsQueryable()
导致集合被加载并转换为IQueryable。有关Entity Framework中的类似行为,请参阅this question。
我会重新编写您的查询以使用NHibernate的LINQ提供程序:
var result = session.Query<SomeEntity>()
.Where(x => x.SomeProperty.ToLower().Contains("Xxx".ToLower)));
答案 3 :(得分:0)
我会在你的QueryOver<T>
进入你的地方并在你的使用中添加NHibernate.Criterion
。代码如下所示:
using NHibernate.Criterion;
//...
var result = session.QueryOver<SomeEntity>()
.Where(e => e.SomeProperty
.IsLike("xyz", MatchMode.Anywhere)).List().ToList();
它会根据需要生成查询。