2011-06-07 60 views
4

我想重構一些通過Linq到SQL從SQL Server 2008讀取數據的C#模塊。這些存儲過程最多隻能訪問一行,因爲我提交了完整的PK作爲參數。顯然Linq-to-SQL並不知道最多隻能返回一行。其結果是,下面的代碼運行,以得到一個值或拋出一個異常:從Linq到SQL精確讀取一行

var results = context.MyProcName(myParameter); 
    foreach (var result in results) 
    { 
     return result.THeColumnINeed; 
    } 
    throw new Exception(string.Format("Value not found for parameter {0}", myParameter)); 

這個代碼把工作做好,但它看起來有點醜。我怎樣才能做得更好?

+1

「有點長得難看」 是輕描淡寫。根據Marc的回答,我的朋友加入了[LINQ查詢運算符方法](http://msdn.microsoft.com/zh-cn/library/bb397896.aspx)的世界。 :) – 2011-06-07 22:53:58

回答

11
return context.MyProcName(myParameter).Single().THeColumnINeed; 
+0

我會推薦使用'.SingleOrDefault()'而不是'.Single()'來避免在沒有記錄的情況下發生異常。 – 2011-06-07 22:37:06

+1

@Simon是一個例外,當沒有記錄是***正好*** ***什麼問題要求... – 2011-06-07 22:53:14

+1

@Simon Bondo由於SingleOrDefault()幾乎肯定會返回null如果沒有記錄被發現,上面的語句將拋出一個'NullReferenceException',這掩蓋了真正的問題。在這種情況下,OP應該更喜歡Single()。 – 2011-06-07 22:56:12

1

試試這個:

return context.MyProcName(myParameter).First();

+2

Single對他的用例更好,因爲如果存在多條記錄,它將引發異常。由於他的SPR基於PK返回數據,因此知道他獲得了多個記錄而不是First()返回的任何一個記錄會很高興。它可以更輕鬆地追蹤錯誤(爲什麼他從SPR獲取多條記錄)。 – 2011-06-07 22:30:45