序列包含多个元素- SingleOrDefault没有帮助
本文关键字:SingleOrDefault 有帮助 元素 包含多 | 更新日期: 2023-09-27 17:53:57
我有下面的行,但仍然得到一个异常"序列包含多个元素"
Details rd = this.db.Details.SingleOrDefault(x => x.TId == Id && x.TypeId == TypeId);
我希望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
部分决定返回什么。如果没有找到值,SingleOrDefault
或FirstOrDefault
返回null,但如果你只是使用Single
或First
,那么它必须找到一个匹配,否则会抛出异常。
编辑:说得好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()。