2009-04-08 37 views
4

我想要一個只返回一個項目的LINQ-to-SQL查詢,而不是它們的集合?如何僅使用LINQ從數據庫中查詢單個項目?

例如,我有一個具有特定名稱的產品列表。數據庫中沒有重複名稱的產品,因此我希望能夠查詢並返回該產品的該實例。

Products product = from p in _productContext.Products 
        where p.name.Equals("BrownShoes") 
        select p; 

我該怎麼做?

回答

9

使用Single

Product product = _productContext.Products 
           .Single(p => p.Name == "BrownShoes"); 

Product product = _productContext.Products 
           .Where(p => p.Name == "BrownShoes") 
           .Single(); 

對於Single沒有查詢表達式語法,因此您必須將其稱爲普通擴展方法。在這一點上,你的查詢更簡單,完全用點符號表示,因此就是上面的表格。您可以寫爲:

Product product = (from p in _productContext.Products 
        where p => p.Name == "BrownShoes" 
        select p).Single(); 

但是,這得到了很多更多的絨毛。如果結果中沒有確切的單個元素,則會拋出異常。

+1

我更喜歡'的SingleOrDefault()`因爲那麼對於不存在測試是檢查`null`那麼簡單,而不是處理一個例外。 – 2009-09-25 14:56:16

4

您需要使用.Single().SingleOrDefault()

Products product = (from p in _productContext.Products where p.name.Equals("BrownShoes") select p).Single(); 

Single()將拋出一個異常,如果有不完全是1個產品出現,SingleOrDefault()將返回null,如果它不存在,或者拋出一個異常,如果有多。

1

如果你確定你會找到一個產品。如果沒有發現產品有一個會拋出異常:

Products product = _productContext.Products 
         .Single(p => p.name.Equals("BrownShoes")); 

或者,如果沒有發現產品,產品將是無效的:

Products product = _productContext.Products 
         .SingleOrDefault(p => p.name.Equals("BrownShoes")); 
3
Products product = (from p in _productContext.Products 
        where p.name.Equals("BrownShoes") 
        select p).FirstOrDefault(); 
6

我推薦使用IQueryable.SingleOrDefault()。如果存在多條記錄,則IQueryable.SingleOrDefault()IQueryable.Single()將拋出異常,但如果存在小於,那麼IQueryable.Single()也會拋出一條記錄。這意味着如果您正在搜索單個記錄,並且出於任何原因它不存在,您必須處理異常。

好多是IQueryable.SingleOrDefault(),因爲你只檢查空:

var employee = (from e in context.Employees 
       where e.ID == employeeID 
       select e).SingleOrDefault(); 

if (employee == null) 
{ 
    // Cope with employee not found 
} 

// Do stuff with employee 
相關問題