2010-01-27 101 views
2

我在LINQ中有以下查詢。 「符號」不存在,並且查詢爲空,但我得到了一個錯誤,轉換和程序崩潰。LINQ表達式返回null

decimal x = from cie in m_entities.Cie 
      where cie.symbol.Equals(Symbol) 
      select cie.cie_id; 

或者我可以在x中有空嗎?

+3

你得到的**確切**異常信息是什麼? – 2010-01-27 01:20:32

+1

假設'm_entities.Cie'是一個IQueryable或IEnumerable,該程序如何在運行時編譯產生異常,因爲查詢的結果應該是IEnumerable而不是小數? – dtb 2010-01-27 01:31:00

回答

5

我不認爲x會永遠爲空 - 你只會得到一個空的IQueryable<T>(或它是IEnumrable<T>?),其中T是cie_id的數據類型。

鑄造錯誤是因爲您試圖將集合投射到decimal

+0

我看不到在代碼中投... – dtb 2010-01-27 01:32:08

+0

...所以你可以將查詢包裝在'(...)'中,然後調用'.FirstOrDefault()'返回單獨的結果或'0'。 – Jay 2010-01-27 01:32:24

+1

該轉換隱含在該查詢返回一個集合,但'x'被聲明爲一個'decimal'。如果用'var'聲明'x',則不會有'InvalidCastException',但'x'也不會是'decimal'。 – Jay 2010-01-27 01:33:35

1

假設cie_id是一個小數,那麼試試這個:

decimal x = (from cie in m_entities.Cie 
        where cie.symbol.Equals(Symbol) 
        select cie.cie_id).FirstOrDefault() 

您當前的代碼試圖分配的IEnumerable <小數>爲十進制,這是行不通的。 FirstOrDefault將選擇第一個匹配項(如果有),否則爲0.

如果您知道將會有1或0個匹配項,您可以考慮使用SingleOrDefault而不是FirstOrDefault。