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

时间:2013-03-01 13:25:19

标签: c# sql nhibernate fluent-nhibernate fluent

我有一个奇怪的问题。我注意到下面定义的代码:

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查询是在第三行继续之后启动的。

4 个答案:

答案 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();

它会根据需要生成查询。