2011-02-08 104 views
8

可能有人指出,這可能是爲什麼發生的事情:C#奇怪拉姆達行爲

我使用NHibernateLinq提供它。

失敗此處列出的代碼:

var sequence = session.Query<T>(); 

var wtfSequence = sequence.Where(x => true); 
var okaySequence = sequence.Where(x => x.Id > 0); 

調試表明sequence(這是一個IQueryable<T>)之後這包含2個元素,其中加入到數據庫中。

我期望第一個Where語句能夠從該序列中產生所有元素,但不幸的是它會留下0個元素。

(WHY ???)

第二Where語句,相反,實際上產生2種元素作爲它應該工作。

以下是對第一個和第二個Where語句的NHibernate -> Sqlite查詢。

NHibernate: select cast(count(*) as INTEGER) as col_0_0_ from "BinaryUnitProxy_IndicatorUnitDescriptor" binaryunit0_ where @p0='true';@p0 = 'True' [Type: String (0)] 

NHibernate: select cast(count(*) as INTEGER) as col_0_0_ from "BinaryUnitProxy_IndicatorUnitDescriptor" binaryunit0_ where binaryunit0_.Id>@p0;@p0 = 0 [Type: Int32 (0)] 

現在,如果我用我的InMemoryRepository,存儲每一個實體在一個簡單的列表測試相同的代碼時,(x => true)工作absolutelty罰款。

所以 - 爲什麼在使用NHibernate時會發生這種情況?這是一個錯誤還是我做錯了什麼?

謝謝。

+2

這很可能與NHibernate處理它從lambda創建的Expression的方式有關,儘管善良知道它在做什麼...... – Massif 2011-02-08 15:04:56

回答

5

我不知道NHibernate,但問題是顯而易見的從生成的SQL:您的數據庫不認爲真(小寫字母t)等於真(大寫字母T)。在SQL服務器中,你可以通過修改數據庫排序規則來改變它(這是一個非常糟糕的主意,除非你想因其他原因不區分大小寫)。

我的猜測是這是NHibernate中的一個錯誤,需要解決。測試t => 1 == 1而不是t => true,這可能工作取決於如何編寫NHibernate代碼。

+1

同意。並請在http://jira.nhforge.org打開一張票 – 2011-02-08 16:13:38

2

我的猜測是,這是基於您顯示的SqLite輸出的NHibernate中的一個錯誤。你可以嘗試X => X.Id == X.Id而不是X => true,看看是否有效。

1

看起來像一個bug給我。它將布爾操作轉換爲字符串評估,甚至搞砸了,因爲它使用true設置查詢並使用True進行評估,因此區分大小寫的測試將失敗。