[英]C# strange lambda behavior
有人可以指出為什么會發生這種情況:
我正在使用NHibernate
和Linq
提供程序。
此處列出了失敗的代碼:
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個元素。
相反,第二個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)
可以了。
那么 - 為什么在使用NHibernate
時會發生這種情況? 這是一個錯誤還是我做錯了什么?
謝謝。
我不知道NHibernate,但問題從生成的SQL中顯而易見:您的數據庫不認為true(小寫t)等於True(大寫T)。 在SQL Server中,您可以通過修改數據庫排序規則來更改此設置(除非您因其他原因需要不區分大小寫,否則這是一個非常糟糕的主意)。
我猜這是你需要解決的NHibernate中的一個錯誤。 測試t => 1 == 1
而不是t => true
,這可能會起作用,具體取決於NHibernate代碼的編寫方式。
我的猜測是,這是NHibernate中基於您顯示的SqLite輸出的錯誤。 您可以嘗試X => X.Id == X.Id
而不是X => true
,看看是否有效。
對我來說看起來像個錯誤。 它將布爾操作轉換為字符串評估,甚至搞砸了,因為它使用true
設置查詢並使用True
進行求值,因此區分大小寫的測試將失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.