2

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

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我的代码中的 this 在 SQL 查询运行后被使用,就像 Linq-to-Objects 而不是 Linq-to-SQL。

当然,在执行第三行之后开始 SQL 查询。

4

4 回答 4

2

如果您想使用 Linq,并且 NHibernate 能够理解它,那么使用CreateQuery<T>扩展名(NHibernate 的一部分,在NHibernate.Linq命名空间中)直接创建一个IQueryable<T>,而不是使用CreateCriteria<T>- 正如您所注意到的那样,它只允许您编写您的 NHibernate 将作为限制处理的查询。

于 2013-03-01T13:56:36.777 回答
1

如果你想在第一个查询中使用 WHERE,我认为你需要添加一个限制:

 unitOfWork.Session.CreateCriteria<SomeEntity>()
    .Add(Restrictions.Eq("SomeProperty", "Some Value"))

干杯

编辑

或者更适合你

 unitOfWork.Session.CreateCriteria<SomeEntity>()
    .Add(Restrictions.InsensitiveLike("SomeProperty", "Some Value"))
于 2013-03-01T13:34:59.133 回答
0

我会进入QueryOver<T>你的位置并添加NHibernate.Criterion你的使用。代码如下所示:

    using NHibernate.Criterion;
    //...
    var result = session.QueryOver<SomeEntity>()
        .Where(e => e.SomeProperty
            .IsLike("xyz", MatchMode.Anywhere)).List().ToList();

它将根据需要生成查询。

于 2013-03-04T18:13:09.290 回答
0

NHibernate is materializing the results set due to the AsQueryable() which causes the collection to be loaded and cast as IQueryable. See this question for similar behavior in Entity Framework.

I would re-write your query to use NHibernate's LINQ provider:

var result = session.Query<SomeEntity>()
                    .Where(x => x.SomeProperty.ToLower().Contains("Xxx".ToLower)));
于 2013-03-01T16:08:23.947 回答