我正在运行一个应该抛出异常的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结果:
答案 0 :(得分:10)
第一个查询说:
过滤
Items
仅包含ItemId == 25
和来自每个i
的人 过滤结果v
,选择i.Values
内的第一项v.AttribID == 69
First
。
此处Items
不会抛出,例如i
为空,因为“来自每个已过滤的结果First
”将完全处理零项,因此永远不会调用Values
。
第二个查询说:
过滤
ItemId == 25
仅包含AttribId == 69
和First
的人,并为我提供第一个匹配的项目。
很明显,在这种情况下,如果不存在匹配的项目,{{1}}无法为您提供有意义的结果并且会抛出。