2013-03-01 44 views
2

我有一個奇怪的問題。我注意到,定義的代碼如下:爲什麼SQL查詢中沒有WHERE子句?

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

給出正確的結果,但SQL查詢我在NHibernateProfiler看着不包含where子句,它只是

SELECT ... 
FROM SomeEntity 

而且似乎這WHERE從我代碼是在SQL查詢運行後使用的,就像Linq-to-Objects而不是Linq-to-SQL一樣。

當然,SQL查詢在第三行之後開始。

+0

什麼是生成的SQL查詢? – slugster 2013-03-01 13:31:04

+0

就像這樣:從SomeEntity中選擇[all columns]; - 沒有條款 – user1938586 2013-03-01 13:32:09

+0

檢查我的答案,它會做的伎倆。 – Mariusz 2013-03-04 18:59:58

回答

1

如果你想第一個查詢我認爲你需要添加一個限制內的WHERE:

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

乾杯

編輯

或者更適合你

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

但是LinQ解決方案呢,我不想使用Resrictions,只有LinQ然後實現它 – user1938586 2013-03-01 13:39:20

2

如果你想使用Linq,一個d爲NHibernate的,以理解,然後使用CreateQuery<T>擴展(NHibernate的一部分,在NHibernate.Linq命名空間)直接創建IQueryable<T>,而不是使用CreateCriteria<T> - 這,因爲你已經注意到了,只是讓你寫的部分你查詢NHibernate將處理爲限制。

0

由於AsQueryable()導致集合被加載並投射爲IQueryable,NHibernate正在實現結果集。有關Entity Framework中的類似行爲,請參閱this question

我將重新編寫查詢中使用NHibernate的LINQ提供程序:

var result = session.Query<SomeEntity>() 
        .Where(x => x.SomeProperty.ToLower().Contains("Xxx".ToLower))); 
0

我會去QueryOver<T>在你的地方,並在您的usings添加NHibernate.Criterion。代碼如下所示:

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

它會根據需要生成查詢。