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,但如果你只是使用Single
或First
那么它必须找到一个匹配,否则会抛出异常.
编辑:好点史蒂夫
自从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)