c# - 使用 LINQ 返回产品价格,在函数中使用什么返回类型?

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

这给了我错误:

Cannot implicitly convert type 'System.Linq.IQueryable<int?>' to 'int'

处理此问题的最佳方法是什么?我需要价格(在这种情况下是一个整数)并在另一个地方用它做一些计算

最佳答案

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

可能想要:

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 属性为空,这将引发异常。

如果您愿意,您仍然可以使用查询表达式 - 但我倾向于不使用简单的情况,因为您随后想在最后添加一个方法调用。等效的查询表达式是:

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 是:

  • 第一(应对1个或多个)
  • FirstOrDefault(应对0、1或更多)
  • SingleOrDefault(应对0或1)

对于 OrDefault 版本,如果您不匹配任何产品,您需要弄清楚该怎么做。

关于c# - 使用 LINQ 返回产品价格,在函数中使用什么返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7511704/

相关文章:

c# - 我怎样才能让我的 trie 更有效率?

c# - || (或)C# 中的 Linq 运算符

entity-framework - 在循环中构建 LINQ 查询

C# MessageBox 导致按键处理程序忽略 SuppressKeyPress

c# - 使用 SUM 和 Group By 对两个表进行 Linq 查询

c# - 在反序列化为 C# 对象之前验证 JSON

c# - 关于 MSVSMON.EXE 似乎没有运行的 Visual Studio 调试错误

c# - 在严格的文本中获取文本的特定部分

c# - 结构中需要重写什么以确保相等性正常运行?

c# - 解析十进制数