在Where()子句中使用FirstOrDefault()



我有一个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;

相关内容

  • 没有找到相关文章

最新更新