我刚刚开始使用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 :(得分:3)
好吧,你选择了查询 - 理论上可以匹配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;
}
...但是如果 没有恰好一个匹配的产品或,则price属性为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
版本,如果您不匹配任何产品,则需要了解该怎么做。
答案 1 :(得分:2)
你需要做的(如果你只想要第一场比赛)
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;
}
答案 2 :(得分:1)
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();
}
答案 3 :(得分:0)
您必须使用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;
}