【问题标题】:What's wrong with this linq query (DBContext)?这个 linq 查询(DBContext)有什么问题?
【发布时间】:2014-01-29 15:37:05
【问题描述】:

我正在使用 VS2012 和 DBContext(实体框架)。

以下查询抛出异常

Customer cust;
using (var context = new MiniNorthwindContext()) {
    cust = (from c in context.Customers
            where c.CustomerName.Contains("SN")
            select c).SingleOrDefault();
}

当我运行它时,它会抛出以下错误:“序列包含多个元素”。

如果我将其替换为

Customer cust;
using (var context = new MiniNorthwindContext()) {
    cust = (from c in context.Customers
            where c.CustomerName == "SN Software"
            select c).SingleOrDefault();
}

然后它通过了。

我可能做错了什么。

【问题讨论】:

  • 在这里指定 Visual Studio 的版本是完全多余的。 1. 问题明显和IDE无关 2. IDE的版本几乎没有说明framework的版本
  • 总而言之,您有多个包含字符“SN”的记录,如果您只想获取第一个(可能不会),只需使用 FirstOrDefault() 代替

标签: c# linq entity-framework


【解决方案1】:

SingleOrDefault 可以做以下三件事之一:

  • 如果没有结果,返回默认值;
  • 如果只有一个结果;退货;
  • 如果有多个结果,则会引发该异常。

所以您的查询匹配不止一行。

【讨论】:

    【解决方案2】:

    SingleOrDefault() 将在查询返回多条记录时抛出异常。如果有第一条记录,您可以使用FirstOrDefault() 代替。

    【讨论】:

      【解决方案3】:

      两个查询都是正确的。问题是数据:

      客户名称
      ESNF CO
      SN软件
      微软
      苹果

      第一个 Query (c.CustomerName.Contains("SN")) 结果:

      • ESNF 公司
      • SN 软件

      返回 2 行,所以 Exception,因为 SingleOrDefault() 只允许 1 条记录。

      第二个查询 (c.CustomerName == "SN Software") 结果:

      • SN 软件

      只返回 1 行

      完美运行!!!。

      问题在于数据。

      【讨论】:

        猜你喜欢
        • 2012-07-08
        • 1970-01-01
        • 1970-01-01
        • 2011-09-29
        • 2011-10-13
        相关资源
        最近更新 更多