2009-07-03 71 views
12

爲什麼linq試圖檢查第二個表情呢?爲什麼在lambda工作中沒有這種短路?

.Where(t => String.IsNullOrEmpty(someNullString) || t.SomeProperty >= Convert.ToDecimal(someNullstring)) 

什麼是平常的解決方法?

更新:
這是關於LINQ to SQL,當然。它不能轉換爲SQL。

+0

這是LINQ to SQL嗎? – SLaks 2009-07-03 14:17:54

+2

我突然發現=>和> =在這段代碼中很混亂。 :-)(我經常使用這兩種語言,但在相同的聲明中沒有一起使用。) – 2009-07-03 14:22:52

回答

11

.WhereTable<>上使用?

如果是這樣,那麼在可以抓取任何數據之前,它必須將LINQ轉換爲SQL,並且必須將它轉換爲decimal。它並不試圖實際執行比較,而是試圖構建檢索數據所必需的構造。

-1

這有幫助嗎?

.Where(t => String.IsNullOrEmpty(someNullString) || (t.SomeProperty >= Convert.ToDecimal(someNullstring))) 

注意到()圍繞第二個條件? 我不認爲它的作品,但總的來說,我更喜歡把()在我的代碼中的每個條件。這樣,編譯器知道哪些部分屬於一起當編譯代碼,以備它短路評價...

-1

我不能與短路評價重現任何問題......

我覺得這個計算結果是這樣的:

[CompilerGenerated] 
private static bool <MyMethod>b__f(MyObject t) 
{ 
    return (String.IsNullOrEmpty(someNullString) 
       || t.SomeProperty >= Convert.ToDecimal(someNullstring)); 
} 

短路那麼這裏工作。

我懷疑你的Enumerable中的其他元素將第一個條件(String.IsNullOrEmpty(someNullString))評估爲false。你能證實這一點嗎?

提供更多的代碼,以便我們分析這一點。

-1

您是否有任何可以評估的範圍內的變量t

你有沒有用括號嘗試這樣的:

.Where(t => (String.IsNullOrEmpty(someNullString) || 
      t.SomeProperty >= Convert.ToDecimal(someNullstring))) 

-1

有上The || (or) Operator in Linq with C#一個解決辦法,根據該你會在你的情況是這樣做的:

.Where(t => t.SomeProperty >= Convert.ToDecimal(someNullstring ?? "0")) 

當然這可能不是你在特定情況下需要的解決方案,但至少它提供了一個想法如何繞過錯誤。

相關問題