首先不要在空集合上抛出异常

时间:2014-07-10 13:47:49

标签: c# linq entity-framework

我正在运行一个应该抛出异常的linq查询(基于我的理解),但事实并非如此。数据库中没有适合查询参数的项目。

以下内容不会引发异常,只是返回null:

from i in Items
where i.ItemID == 25
select i.Values.First(v => v.AttribID == 69)

以下内容会按预期抛出异常:

(from i in Values
where i.ItemID == 25
where i.AttribID == 69
select i).First()

通过测试几种不同形式的查询,我能找到的唯一区别是。当lambda表达式内部没有返回任何内容时,首先似乎没有抛出异常,但是当没有参数调用.First时它确实如此。请帮我理解原因。

澄清......

from i in Items
where i.ItemID == 25
select i

...返回1项。

在测试这些查询时,请参阅下面的linqPad结果:

enter image description here

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:10)

第一个查询说:

  

过滤Items仅包含ItemId == 25和来自每个i的人   过滤结果v,选择i.Values内的第一项v.AttribID == 69   First

此处Items不会抛出,例如i为空,因为“来自每个已过滤的结果First”将完全处理零项,因此永远不会调用Values

第二个查询说:

  

过滤ItemId == 25仅包含AttribId == 69First的人,并为我提供第一个匹配的项目。

很明显,在这种情况下,如果不存在匹配的项目,{{1}}无法为您提供有意义的结果并且会抛出。