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

Sta*_*ace 23 c# linq-to-entities c#-4.0

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

Details rd = this.db.Details.SingleOrDefault(x => x.TId == Id && x.TypeId == TypeId);
Run Code Online (Sandbox Code Playgroud)

我希望SingleOrDefault可以避免异常.

Kev*_*vin 40

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

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

假设您不关心是否有多个匹配而您只想要第一个匹配,如果没有找到匹配则为null ...那么您可能需要以下...

Details rd = this.db.Details
    .FirstOrDefault(x => x.TId == Id && x.TypeId == TypeId);
Run Code Online (Sandbox Code Playgroud)

请注意,这两种方法只返回一个元素,它们只有在找到匹配项后才会有所不同. First停止查看该点并返回它找到的内容,Single继续检查列表的其余部分以确保没有更多匹配.OrDefault如果未找到匹配项,该部件将确定返回的内容. SingleOrDefault或者FirstOrDefault,如果没有价值发现返回null,但如果你只是使用SingleFirst那么它必须找到一个匹配,否则会抛出异常.

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

Details rd = this.db.Details
    .OrderByDescending(x => x.UpdateDate)
    .FirstOrDefault(x => x.TId == Id && x.TypeId == TypeId);
Run Code Online (Sandbox Code Playgroud)

  • 我想添加一个使用OrderBy的可能性的建议 (2认同)