0

当我知道它应该返回至少一个结果时,我有一个 LINQ 查询没有返回任何结果。我正在动态构建查询。在我到达过滤掉所有结果的行之前,我查看了调试器中的结果集,它包含数百行。在这一行之后,当它确实应该包含至少一个时,它包含 0。

query = query.Where(x => 
    x.Lineages.FirstOrDefault().Sire.Contains(options.PedigreeContains));

在这种情况下,“x”表示一个名为“Horse”的实体。'options.PedigreeContains' 只是一个字符串值。Lineages 表如下所示:

ID         HorseID         Sire       Dam        etc...

我什至可以在调试器中拉出一个 Horse 实体(我知道应该返回一个作为结果的实体),检查 Lineages 属性并查看它已完全填充,包括与我的搜索匹配的 Sire 值。所以一切似乎都应该正常工作,除了我正在使用的 LINQ 查询显然存在一些问题。

有没有人认为我正在做的事情有任何本质上的错误,这会导致过滤掉我知道应该存在的结果?

编辑:为澄清起见,这是一对一的关系。我知道 Lineages 对象存在,我知道只有一个,而且我知道它匹配。只是由于某种原因它返回零结果,所以我认为我编写查询的方式可能存在问题。如果该查询应该按照其编写的方式工作(减去所有额外的“可能性”,如果不存在血统,不止一个等),那么它一定是我代码中其他地方的问题。

4

4 回答 4

1

实际上回答您的问题:不。您的查询本质上没有任何问题。它一定是查询构造、数据库结构或数据中其他地方的问题。

调试时,不要枚举和验证结果计数,而是复制query表达式值并查看生成的 SQL 的样子。您可以在更改IQueryable query. 其他建议,例如 @Jalalx 使用 .Any() 来避免 @John Saunders 指出的内容。

于 2013-01-13T20:56:30.127 回答
1

Lineages如果返回的第一个不Sire包含所需的内容,则您无法订购option.PedigreeContains. 在这种情况下,结果集将为空,而不管Sire.Lineages

于 2013-01-12T02:51:05.887 回答
1

如果FirstOrDefault返回“默认”怎么办?你会得到一个NullReferenceException.

于 2013-01-12T02:44:16.957 回答
0

如果您在拥有它的地方执行 FirstOrDefault() ,那么您不是在可能有许多公牛中选择第一个,所以如果后面的一个与您的匹配,您将找不到它?

query = query.Where(x => 
    x.Lineages.FirstOrDefault(lineage => lineage.Sire.Contains(options.PedigreeContains))).Sire;
于 2013-01-12T02:49:28.620 回答