IEnumerable.Single 引发异常

发布于 2024-12-01 08:25:45 字数 496 浏览 0 评论 0原文

我有以下使用实体框架的代码:

g_getWidgets = from getWidgets in g_libraryEntities.GET_Widgets() select getWidgets;
.
.
.
IQueryable<GET_Fragments_Result> iqueryable = g_getWidgets.AsQueryable<GET_Widgets_Result>();
var nameValueObject = from nv in iqueryable where nv.ID == int.Parse(key) select nv;
widget = nameValueObject.Single();

widget = nameValueObject.Single(); 行抛出异常,指出“查询的结果不能枚举多次。

执行此功能的正确方法是什么?我只想返回具有正确 ID 的项目。

I have the following code which uses Entity Framework:

g_getWidgets = from getWidgets in g_libraryEntities.GET_Widgets() select getWidgets;
.
.
.
IQueryable<GET_Fragments_Result> iqueryable = g_getWidgets.AsQueryable<GET_Widgets_Result>();
var nameValueObject = from nv in iqueryable where nv.ID == int.Parse(key) select nv;
widget = nameValueObject.Single();

The widget = nameValueObject.Single(); line throws an exception saying "The result of a query cannot be enumerated more than once.

What is the proper way to perform this function? I just want to to return an item with the proper ID.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

ゃ人海孤独症 2024-12-08 08:25:45

我建议使用 SingleOrDefault 而不是 FirstOrDefault

Enumerable.FirstOrDefault()

返回序列的第一个元素,如果序列不包含元素,则返回默认值。

来源:http://msdn.microsoft.com/en-us/库/bb340482.aspx

这意味着如果有多个匹配项,则仅返回找到的第一个。

Enumerable.SingleOrDefault()

返回序列中唯一的元素,如果序列为空则返回默认值;如果序列中存在多个元素,此方法将引发异常。

来源:http://msdn.microsoft.com/en-us/库/bb342451.aspx

这意味着如果有多个匹配项,则会引发异常。如果重复条目构成数据违规,这非常有用。

I would recommend using SingleOrDefault instead of FirstOrDefault.

Enumerable.FirstOrDefault()

Returns the first element of a sequence, or a default value if the sequence contains no elements.

Source: http://msdn.microsoft.com/en-us/library/bb340482.aspx

This means that if there are more than one match, only the first one found will be returned.

Enumerable.SingleOrDefault()

Returns the only element of a sequence, or a default value if the sequence is empty; this method throws an exception if there is more than one element in the sequence.

Source: http://msdn.microsoft.com/en-us/library/bb342451.aspx

This means that if there is more than one match an exception is thrown. This is useful if having duplicate entries is a data violation.

独木成林 2024-12-08 08:25:45

这将完成同样的事情,因为您只寻找 ID 相等的单个匹配项。

var nameValueObject = iqueryable.First( o => o.ID == int.Parse(key) );

如果您不希望在未找到匹配项时引发异常,请改用 FirstOrDefault。在这种情况下,返回值可能为 null,但如果现有项目是不变量,我更愿意使用 First 并尽早崩溃。

This will accomplish the same thing since you are only looking for a single match where the IDs are equal.

var nameValueObject = iqueryable.First( o => o.ID == int.Parse(key) );

If you don't want an exception to be thrown if a match is not found use FirstOrDefault instead. In that case the return value may be null, but if the item existing is an invariant I would prefer to use First and crash early.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文