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

时间:2014-03-27 15:06:03

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

我有以下一行,但仍然有例外" 序列包含多个元素"

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

我希望SingleOrDefault可以避免异常。

2 个答案:

答案 0 :(得分:32)

SingleOrDefault会返回 SINGLE 元素,如果找不到任何元素,则返回null。如果在您的Enumerable中找到2个元素,则它会抛出您看到的异常。就像Highlander ......单身 - 只有一个。

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);

答案 1 :(得分:0)

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