c# - 序列包含多个元素 - SingleOrDefault 无济于事

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

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

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

我希望 SingleOrDefault 能够避免异常。

最佳答案

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

关于c# - 序列包含多个元素 - SingleOrDefault 无济于事,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22691622/

相关文章:

c#-4.0 - Log4Net 与温莎城堡

asp.net-mvc - 如何从 Entity Framework 模型中删除对象而不先加载它?

.net - Entity Framework linq - 我应该学习哪个,基于查询的方法?

c# - 使 Linq 导航属性对开发人员来说更加明显

c# - Json.NET 反序列化 Dictionary<uint, T> 并执行转换

c# - 在代码隐藏之外的其他地方捕获事件

c# - 获取了解在文件夹中插入文件的功能

c# - 如何在 UWP 应用程序中同步获取图像的尺寸?

c# - 获取通用列表项的计数

c# - 为什么 Visual Studio 2010 不允许在 linq 查询中使用 "is null"而 VS2017 允许?