Any()没有返回预期结果 - 替代方案?

时间:2016-01-07 15:54:00

标签: .net entity-framework linq linq-to-sql any

Edit2 找到了一些团队成员的解决方案。请参阅我对该决议的评论。

看了之后,似乎找不到我问题的真正答案。

我正在尝试查找具有其组类型为空/空/空的任何组的所有用户。代码:

Higher1Green

我们的数据库中有许多用户应该返回此表达式。相反,它不会返回任何。一个比我更聪明,更有经验的同事昨天和我一起看了生成的SQL,他得出的结论是,这是LINQ和Entity不能很好地协同工作的一个很好的例子。查询的实体正确映射到数据库。我检查过并检查过,这段代码绝对是代码(不是之前或之后)。最令人困惑的是,我们的代码中还有其他linq查询看起来非常类似于返回预期结果的查询。

所以有两个问题:

1)你有什么看到我做错了吗?

2)如果不编写原始SQL,可能的替代方案是什么?我一直试图尽可能多地阅读LINQ,但我确信我错过了一些东西。

谢谢!

(注意:我没有找到这些帖子来完全回答我的问题:1234

编辑1:生成的sql代码。

Higher1Blue.build()

3 个答案:

答案 0 :(得分:1)

要获取PersonGroup个对象的列表,请使用Where代替Any

expression = (x => x.PersonGroups.Where(y => y.Group.GroupType == null || y.Group.GroupType == "")); 
return expression

答案 1 :(得分:1)

问题毕竟确实在我们的映射中。

实体框架默认将所有字段标记为可选。 在我们的案例中,我们的团队自定义设置实体,在此期间他们将所有字段设置为我们上下文中所需的。 这是问题的症结所在; 当数据映射中的字段被标记为必需时,实体只是在执行LINQ查询时跳过检查表中该字段的空值。正如你从我的问题中看到的那样,空字段是我正在寻找的一些确切的东西 - 在我的案例中有很多。因此,为了解决这个问题,我只是在数据映射中将该字段标记为可选。因为实体知道检查它是否为空字段,它按预期运行。

Tl; dr:如果遇到类似的问题,请检查您的conext和数据映射,以确保数据库中可以为空的字段在数据映射中也标记为可选。否则,实体不会检查它是否为空。

答案 2 :(得分:0)

PersonGroups集合,Any将根据您的条件仅返回true或false。如果集合包含PersonGroup中的任何一项 - > group.GroupType == null或为空,然后返回true,否则为false。

您的期望结果仅为真或假?

相关问题