2009-10-27 49 views
0

我對Linq很新,我可以在任何地方找到多行數據讀取示例(使用foreach()),但讀取單行數據的正確方法是什麼?像經典產品詳細信息頁面。使用Linq to SQL讀取單行數據的正確方法是什麼?

下面是我的嘗試:

var q = from c in db.Products 
    where c.ProductId == ProductId 
    select new { c.ProductName, c.ProductDescription, c.ProductPrice, c.ProductDate }; 

string strProductName = q.First().ProductName.ToString(); 
string strProductDescription = q.First().ProductDescription.ToString(); 
string strProductPrice = q.First().ProductPrice.ToString(); 
string strProductDate = q.First().ProductDate.ToString(); 

的代碼對我來說很好,但是當我看到生成的實際SQL表達式使用SQL事件探查器,這讓我害怕!該程序執行四個Sql表達式與它們是完全一樣

因爲我從一行讀四列。我想我必須做出錯誤的事情,所以我想知道做這件事的正確方法是什麼?

謝謝!

+0

更新你的直覺的一種方法可能是這樣的:請注意,First()是*方法*而不是*屬性* - 這表明它將*做某事*。你只需要*執行一次*,所以只需要調用First()一次(如下所述,考慮FirstOrDefault())。 – AakashM 2009-10-27 14:44:14

+1

對我來說,什麼會讓我害怕,而不是*能夠在我的項目中使用LINQ。沒有它,我無法生活。 – Konamiman 2009-10-27 14:48:04

回答

9

使用First()擴展方法將拋出System.InvalidOperationException當在序列中沒有元素滿足指定條件。

如果使用FirstOrDefault()擴展方法,則可以針對返回的對象進行測試以查看它是否爲null。

FirstOrDefault返回序列的第一個元素,如果序列不包含任何元素,則返回默認值;在這種情況下,產品的默認值應該爲空。試圖訪問該空對象的屬性將引發ArgumentNullException

var q = (from c in db.Products 
    where c.ProductId == ProductId 
    select new { c.ProductName, c.ProductDescription, c.ProductPrice, c.ProductDate }).FirstOrDefault(); 

if (q != null) 
{ 
    string strProductName = q.ProductName; 
    string strProductDescription = q.ProductDescription; 
    string strProductPrice = q.ProductPrice; 
    string strProductDate = q.ProductDate; 
} 

而且,你不應該投各物業ToString()如果你的對象模型是否設置正確。 ProductName,ProductDescription等應該已經是一個字符串。

你得到4個獨立的sql查詢的原因是,因爲每次你打電話​​linq正在生成一個新的查詢。

5
var q = (from c in db.Products 
     where c.ProductId == ProductId 
     select new { c.ProductName, c.ProductDescription, c.ProductPrice, c.ProductDate } 
     ).First(); 

string strProductName = q.ProductName.ToString(); 
string strProductDescription = q.ProductDescription.ToString(); 
string strProductPrice = q.ProductPrice.ToString(); 
string strProductDate = q.ProductDate.ToString(); 
相關問題