【问题标题】:Sequence contains more than one element - SingleOrDefault not helping序列包含多个元素 - SingleOrDefault 没有帮助
【发布时间】:2016-06-30 15:41:26
【问题描述】:

我有下面这行但仍然得到一个异常“序列包含多个元素

Details rd = this.db.Details.SingleOrDefault(x => x.TId == Id && x.TypeId == TypeId);

我希望 SingleOrDefault 能避免该异常。

【问题讨论】:

    标签: c# c#-4.0 linq-to-entities


    【解决方案1】:

    SingleOrDefault 返回一个 SINGLE 元素,如果没有找到元素,则返回 null。如果在您的 Enumerable 中找到 2 个元素,那么它会引发您看到的异常。就像汉兰达一样......单 - 只能有一个。

    FirstOrDefault 返回它找到的 FIRST 元素,如果没有找到元素,则返回 null。因此,如果有 2 个元素与您的谓词匹配,则忽略第二个元素。

    假设您不在乎是否有多个匹配项,并且您只想要第一个匹配项,或者如果没有找到匹配项则为 null...那么您可能需要以下...

    Details rd = this.db.Details
        .FirstOrDefault(x => x.TId == Id && x.TypeId == TypeId);
    

    请注意,这两种方法都只返回一个元素,它们仅在找到匹配项后所做的不同。 First 停止查看该点并返回它找到的内容,Single 继续检查列表的其余部分以确保没有更多匹配项。 OrDefault 部分确定如果未找到匹配项则返回什么。如果没有找到值,SingleOrDefaultFirstOrDefault 将返回 null,但如果您只使用 SingleFirst,则它必须找到一个匹配项,否则将引发异常。

    编辑:好点史蒂夫 由于First 返回第一个元素,您可能需要使用OrderBy 以确保您想要的元素确实是第一个。例如...假设您的对象具有 UpdateDate 属性,并且您想要具有最新 UpdateDate 的对象...

    Details rd = this.db.Details
        .OrderByDescending(x => x.UpdateDate)
        .FirstOrDefault(x => x.TId == Id && x.TypeId == TypeId);
    

    【讨论】:

    • 我会将建议添加到使用 OrderBy 的可能性中
    【解决方案2】:

    如果您有一个列表,请将列表转换为 IEnumerable 列表,然后您可以使用 FirstOrDefault 方法

     IEnumerable<BuyOnlineSearchdetails> details = new List<BuyOnlineSearchdetails>();
    
    var FirstRow = details.FirstOrDefault();
                string Count = "0";
                if (FirstRow != null)
                {
                    Count = FirstRow.TotalCount.ToString();
                }
                else
                {
                    Count = "0";
                }
    

    【讨论】:

    • 为我工作。
    猜你喜欢
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 2015-01-21
    • 2014-03-09
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多