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

Mat*_*ann 4 c# linq entity-framework

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

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

from i in Items
where i.ItemID == 25
select i.Values.First(v => v.AttribID == 69)
Run Code Online (Sandbox Code Playgroud)

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

(from i in Values
where i.ItemID == 25
where i.AttribID == 69
select i).First()
Run Code Online (Sandbox Code Playgroud)

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

澄清...

from i in Items
where i.ItemID == 25
select i
Run Code Online (Sandbox Code Playgroud)

...返回1项.

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

在此输入图像描述

在此输入图像描述

在此输入图像描述

Jon*_*Jon 10

第一个查询说:

过滤器Items,以仅包括具有ItemId == 25来自每个滤波结果i,选择第一个项vi.Values,使得v.AttribID == 69.

First如果例如Items是空的,这里不会抛出,因为"从每个过滤的结果i"将精确处理零项,因此First永远不会被调用.

第二个查询说:

过滤Values到只包含那些和ItemId == 25,AttribId == 69并给我第一个匹配的项目.

很明显,在这种情况下,如果不存在匹配的项目,First则无法给出有意义的结果并且会抛出.