为什么SQL查询中没有WHERE子句?
本文关键字:WHERE 子句 SQL 查询 为什么 | 更新日期: 2023-09-27 18:01:55
我有一个奇怪的问题。我注意到下面定义的代码:
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到对象,而不是linq到SQL。
当然,SQL查询是在第三行之后开始的
如果你想使用Linq,并且让NHibernate 理解它,那么使用CreateQuery<T>
扩展(NHibernate的一部分,在NHibernate.Linq
命名空间中)直接创建IQueryable<T>
,而不是使用CreateCriteria<T>
-正如你所注意到的,它只允许你编写NHibernate将作为限制处理的查询部分
如果你想在第一个查询中的WHERE,我认为你需要添加一个限制:
unitOfWork.Session.CreateCriteria<SomeEntity>()
.Add(Restrictions.Eq("SomeProperty", "Some Value"))
欢呼编辑
或者更适合你
unitOfWork.Session.CreateCriteria<SomeEntity>()
.Add(Restrictions.InsensitiveLike("SomeProperty", "Some Value"))
NHibernate正在实现由于AsQueryable()
导致的结果集,这导致集合被加载并转换为IQueryable。关于实体框架中的类似行为,请参阅此问题。
我会重写你的查询使用NHibernate的LINQ提供程序:
var result = session.Query<SomeEntity>()
.Where(x => x.SomeProperty.ToLower().Contains("Xxx".ToLower)));
我会在你的地方添加QueryOver<T>
,并在你的使用中添加NHibernate.Criterion
。代码看起来像这样:
using NHibernate.Criterion;
//...
var result = session.QueryOver<SomeEntity>()
.Where(e => e.SomeProperty
.IsLike("xyz", MatchMode.Anywhere)).List().ToList();
它会生成你想要的查询