我有一个LINQ查询,返回没有结果,当我知道它应该返回至少一个。我正在动态地构建查询。在到达过滤掉所有结果的行之前,我在调试器中查看了结果集,它包含数百行。在这行之后,它实际上应该包含至少一个,但却包含0。
query = query.Where(x =>
x.Lineages.FirstOrDefault().Sire.Contains(options.PedigreeContains));
在本例中,'x'表示一个名为'Horse'的实体。"选项。'只是一个字符串值。谱系表如下所示:
ID HorseID Sire Dam etc...
我甚至可以在调试器中拉出一个Horse实体(我知道应该作为结果返回的那个实体),检查Lineages属性并查看它完全填充,包括与我的搜索匹配的Sire值。所以一切似乎都应该工作,除了我正在使用的LINQ查询明显有一些问题。
有没有人看到我正在做的事情有什么本质上的错误,这会导致我知道应该在那里的结果被过滤掉?
EDIT:澄清一下,这是1对1的关系。我知道Lineages对象存在,我知道只有一个,我知道它匹配。它只是出于某种原因,它返回零结果,所以我认为我写查询的方式可能有问题。如果该查询应该按照编写的方式工作(减去所有额外的"可能性",如果没有血统存在,多于一个等),那么它一定是我代码中的其他地方的问题。
如果FirstOrDefault
返回"Default"怎么办?你会得到一个NullReferenceException
如果返回的第一个没有包含option.PedigreeContains
的所需Sire
,则没有提供订购Lineages
的方法。在这种情况下,结果集将为空,而不管Lineages
中的其他Sire
。
实际上回答你的问题:不。你的问题本身并没有错。这一定是你的查询结构,数据库结构或数据中的其他地方的问题。
在调试时,不要枚举和验证结果计数,而是复制query
表达式值并查看生成的SQL是什么样子的。您可以在更改IQueryable query
之前和之后执行此操作。其他建议,如@Jalalx使用。any()来避免@John Saunders指出的问题。
如果您在拥有它的地方执行FirstOrDefault(),那么您不是在取可能有许多类型的第一个吗?因此,如果后面的一个与您的匹配,您将找不到它?
query = query.Where(x =>
x.Lineages.FirstOrDefault(lineage => lineage.Sire.Contains(options.PedigreeContains))).Sire;