序列包含多个元素- SingleOrDefault没有帮助

本文关键字:SingleOrDefault 有帮助 元素 包含多 | 更新日期: 2023-09-27 17:53:57

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

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

我希望SingleOrDefault能避免这个异常

序列包含多个元素- SingleOrDefault没有帮助

SingleOrDefault返回SINGLE元素,如果没有找到元素则返回null。如果在Enumerable中找到2个元素,那么它会抛出您所看到的异常。就像高地人一样……使用Single -只能有一个

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

假设你不关心是否有多个匹配,你只想要第一个或null,如果没有找到匹配…那么您可能需要以下内容…

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

注意,这两个方法都只返回一个元素,它们的区别只是在找到匹配后所做的事情。First停止查看该点并返回它找到的内容,Single继续检查列表的其余部分以确保没有更多匹配。如果没有找到匹配项,OrDefault部分决定返回什么。如果没有找到值,SingleOrDefaultFirstOrDefault返回null,但如果你只是使用SingleFirst,那么它必须找到一个匹配,否则会抛出异常。

编辑:说得好Steve由于First返回第一个元素,您可能需要使用OrderBy来确保您想要的元素确实是第一个。例如……假设你的对象有一个UpdateDate属性,你想要的对象具有最近的UpdateDate…

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

如果你有一个列表,将列表转换为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";
            }

您必须使用FirstOrDefault()而不是SingleOrDefault()。

如果存在多个元素,则SingleOrDefault抛出异常。