使用LINQ返回产品价格,在功能中使用什么返回类型?

时间:2011-09-22 08:18:32

标签: c# .net linq linq-to-entities compiler-errors

我刚刚开始使用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)并在另一个地方进行一些计算

谢谢!

4 个答案:

答案 0 :(得分:3)

好吧,你选择了查询 - 理论上可以匹配0,1个或更多记录。在每种情况下你想做什么?此外,看起来product_price_kgint? - 如果它为空,你想做什么?

可能想要:

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;
}