簡體   English   中英

C#奇怪的lambda行為

[英]C# strange lambda behavior

有人可以指出為什么會發生這種情況:

我正在使用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個元素。

(為什么???)

相反,第二個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM