我想要一個只返回一個項目的LINQ-to-SQL查詢,而不是它們的集合?如何僅使用LINQ從數據庫中查詢單個項目?
例如,我有一個具有特定名稱的產品列表。數據庫中沒有重複名稱的產品,因此我希望能夠查詢並返回該產品的該實例。
Products product = from p in _productContext.Products
where p.name.Equals("BrownShoes")
select p;
我該怎麼做?
我想要一個只返回一個項目的LINQ-to-SQL查詢,而不是它們的集合?如何僅使用LINQ從數據庫中查詢單個項目?
例如,我有一個具有特定名稱的產品列表。數據庫中沒有重複名稱的產品,因此我希望能夠查詢並返回該產品的該實例。
Products product = from p in _productContext.Products
where p.name.Equals("BrownShoes")
select p;
我該怎麼做?
使用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();
但是,這得到了很多更多的絨毛。如果結果中沒有確切的單個元素,則會拋出異常。
您需要使用.Single()
或.SingleOrDefault()
:
Products product = (from p in _productContext.Products where p.name.Equals("BrownShoes") select p).Single();
Single()
將拋出一個異常,如果有不完全是1個產品出現,SingleOrDefault()
將返回null,如果它不存在,或者拋出一個異常,如果有多。
如果你確定你會找到一個產品。如果沒有發現產品有一個會拋出異常:
Products product = _productContext.Products
.Single(p => p.name.Equals("BrownShoes"));
或者,如果沒有發現產品,產品將是無效的:
Products product = _productContext.Products
.SingleOrDefault(p => p.name.Equals("BrownShoes"));
Products product = (from p in _productContext.Products
where p.name.Equals("BrownShoes")
select p).FirstOrDefault();
我推薦使用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
我更喜歡'的SingleOrDefault()`因爲那麼對於不存在測試是檢查`null`那麼簡單,而不是處理一個例外。 – 2009-09-25 14:56:16