[英]return product price using LINQ, what return type to use in function?
我剛剛開始使用LINQ,並且嘗試從數據庫中選擇產品價格並返回產品價格,如下所示:
public int GetPricePerKg(Product prod)
{
var result = from p in dc.Products
where p.pk_product_id == prod.pk_product_id
select p.product_price_kg;
return result;
}
這給了我錯誤:
無法將類型'
System.Linq.IQueryable<int?>
'隱式轉換為'int
'
處理此問題的最佳方法是什么? 我需要價格(在這種情況下為int),並在其他地方進行一些計算
謝謝!
好吧,您選擇了一個查詢 -理論上可以匹配0、1或多個記錄。 您想在每種情況下做什么? 另外,看起來product_price_kg
是int?
-如果為空,您想怎么辦?
您可能想要:
public int GetPricePerKg(Product prod)
{
return dc.Products.Where(p => p.pk_product_id == prod.pk_product_id)
.Select(p => p.product_price_kg)
.Single()
.Value;
}
...但如果要么不是正好有一個匹配的產品或價格屬性為null,將拋出異常。
如果需要,您仍然可以使用查詢表達式-但在某些簡單情況下,您通常不想在結尾添加一個方法調用。 查詢表達式的等效項是:
return (from p in dc.Products
where p.pk_product_id == prod.pk_product_id
select p.product_price_kg).Single().Value;
另外,您可以使用帶有謂詞的Single()
版本,如下所示:
return dc.Products.Single(p => p.pk_product_id == prod.pk_product_id)
.product_price_kg.Value;
毫無疑問,還有其他變體-它們都將做同樣的事情-選擇您認為可讀性最高的那個。
編輯:其他選項,而不是Single
是:
First
(應對1個或更多) FirstOrDefault
(處理0、1或更多) SingleOrDefault
(處理0或1) 對於OrDefault
版本,如果您不匹配任何產品,則需要解決該怎么辦。
您需要做(如果您只想讓第一場比賽回來)
public int GetPricePerKg(Product prod)
{
var result = (from p in dc.Products
where p.pk_product_id == prod.pk_product_id
select p.product_price_kg).FirstOrDefault();
return result;
}
John Skeet和saj的回答都是正確的。 這只是與您發布的代碼更加一致的另一種替代語法:
public int GetPricePerKg(Product prod)
{
var result = from p in dc.Products
where p.pk_product_id == prod.pk_product_id
select p.product_price_kg;
return result.FirstOrDefault();
}
您必須使用FristOrDefault()
擴展方法
public int GetPricePerKg(Product prod)
{
var result = (from p in dc.Products
where p.pk_product_id == prod.pk_product_id
select p.product_price_kg).FirstOrDefault();
return result;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.