爲什麼linq試圖檢查第二個表情呢?爲什麼在lambda工作中沒有這種短路?
.Where(t => String.IsNullOrEmpty(someNullString) || t.SomeProperty >= Convert.ToDecimal(someNullstring))
什麼是平常的解決方法?
更新:
這是關於LINQ to SQL,當然。它不能轉換爲SQL。
爲什麼linq試圖檢查第二個表情呢?爲什麼在lambda工作中沒有這種短路?
.Where(t => String.IsNullOrEmpty(someNullString) || t.SomeProperty >= Convert.ToDecimal(someNullstring))
什麼是平常的解決方法?
更新:
這是關於LINQ to SQL,當然。它不能轉換爲SQL。
是.Where
在Table<>
上使用?
如果是這樣,那麼在可以抓取任何數據之前,它必須將LINQ轉換爲SQL,並且必須將它轉換爲decimal
。它並不試圖實際執行比較,而是試圖構建檢索數據所必需的構造。
這有幫助嗎?
.Where(t => String.IsNullOrEmpty(someNullString) || (t.SomeProperty >= Convert.ToDecimal(someNullstring)))
注意到()圍繞第二個條件? 我不認爲它的作品,但總的來說,我更喜歡把()在我的代碼中的每個條件。這樣,編譯器知道哪些部分屬於一起當編譯代碼,以備它短路評價...
我不能與短路評價重現任何問題......
我覺得這個計算結果是這樣的:
[CompilerGenerated]
private static bool <MyMethod>b__f(MyObject t)
{
return (String.IsNullOrEmpty(someNullString)
|| t.SomeProperty >= Convert.ToDecimal(someNullstring));
}
短路那麼這裏工作。
我懷疑你的Enumerable中的其他元素將第一個條件(String.IsNullOrEmpty(someNullString)
)評估爲false。你能證實這一點嗎?
提供更多的代碼,以便我們分析這一點。
您是否有任何可以評估的範圍內的變量t?
你有沒有用括號嘗試這樣的:
.Where(t => (String.IsNullOrEmpty(someNullString) ||
t.SomeProperty >= Convert.ToDecimal(someNullstring)))
?
有上The || (or) Operator in Linq with C#一個解決辦法,根據該你會在你的情況是這樣做的:
.Where(t => t.SomeProperty >= Convert.ToDecimal(someNullstring ?? "0"))
當然這可能不是你在特定情況下需要的解決方案,但至少它提供了一個想法如何繞過錯誤。
這是LINQ to SQL嗎? – SLaks 2009-07-03 14:17:54
我突然發現=>和> =在這段代碼中很混亂。 :-)(我經常使用這兩種語言,但在相同的聲明中沒有一起使用。) – 2009-07-03 14:22:52