为什么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查询是在第三行之后开始的

为什么SQL查询中没有WHERE子句?

如果你想使用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();

它会生成你想要的查询