C# ||LINQ中的(或)运算符转换为SQL脚本

C# ||LINQ中的(或)运算符转换为SQL脚本,c#,sql,linq,.net-core,C#,Sql,Linq,.net Core,我在一个.NET核心项目中工作,面临一个问题。我查询的表有两列 删除了一个可为空的布尔列。在前端删除项目时,将通过此列将其标记为已删除。根据我们前助教的设计,它是无效的。我现在不想冒险改变它。 已批准布尔列-不为空。管理员批准项目后,其对应值将设置为1。否则,它将是0。 要求是前端普通用户请求的任何更改必须经过管理员批准。这包括用户请求删除项目的时间。这意味着管理员应该能够查看所有未批准的项目。此外,还应检索所有未标记为已删除的项目 这是我的LINQ查询 var query = dbContex

我在一个.NET核心项目中工作,面临一个问题。我查询的表有两列

删除了一个可为空的布尔列。在前端删除项目时,将通过此列将其标记为已删除。根据我们前助教的设计,它是无效的。我现在不想冒险改变它。 已批准布尔列-不为空。管理员批准项目后,其对应值将设置为1。否则,它将是0。 要求是前端普通用户请求的任何更改必须经过管理员批准。这包括用户请求删除项目的时间。这意味着管理员应该能够查看所有未批准的项目。此外,还应检索所有未标记为已删除的项目

这是我的LINQ查询

var query = dbContext.Variations.Where(o => o.IsDeleted != true || !o.IsApproved);
当查看应用程序的控制台时,我看到查询是这样翻译的

SELECT [v].[Id], [v].[Variation], [v].[IsApproved], [v].[IsChange], [v].[IsDeleted], [v].[RequestedEmail], [v].[RequestedUserName], [v].[UpdatedAt], [v].[UpdatedBy]
      FROM [Variation] AS [v]
      WHERE ([v].[IsDeleted] IS NULL OR ([v].[IsDeleted] IS NOT NULL AND ([v].[IsDeleted] = 0))) AND ((([v].[IsDeleted] <> 1) OR [v].[IsDeleted] IS NULL) OR ([v].[IsApproved] = 0))
结果是,它只给了我未删除的项目,但没有给我未批准的项目,即使我要求这样做。如果我将上述已翻译的查询更改为

SELECT [v].[Id], [v].[Variation], [v].[IsApproved], [v].[IsChange], [v].[IsDeleted], [v].[RequestedEmail], [v].[RequestedUserName], [v].[UpdatedAt], [v].[UpdatedBy]
      FROM [Variation] AS [v]
      WHERE ([v].[IsDeleted] IS NULL OR ([v].[IsDeleted] IS NOT NULL AND ([v].[IsDeleted] = 0))) OR ((([v].[IsDeleted] <> 1) OR [v].[IsDeleted] IS NULL) OR ([v].[IsApproved] = 0))

我将按预期获取未删除和未批准的项目。我想知道为什么我的LINQ查询中的| |运算符被转换为SQL中的AND运算符。我遗漏了什么吗?有人能帮我吗?谢谢。

为什么不直接使用&&

var query = dbContext.Variations.Where(o => o.IsDeleted != true && o.IsApproved == false);

好的,我已经知道出了什么问题。团队成员似乎在实体的配置类中通过HasQueryFilter方法添加了模型级实体过滤器。这就是为什么无论我做什么,它总是生成错误的sql查询。我的解决方案是添加IgnoreQueryFilter,问题就解决了。谢谢大家的帮助

IsDeleted可为空吗?可以。这就是为什么我用o.IsDeleted!=正确…必须由管理员批准。这包括当用户请求删除项目时-这意味着删除的项目将始终获得批准。如果是这样,您只能使用一个条件o.IsApproved==false突出显示对查询所做的“更改”。然后使用所需的逻辑将其简化为最小的“有效查询”,并更改LINQ查询以反映。也就是说:不要担心LINQ的生成,关注实际的逻辑——“和”是误导性的。它给出了不同的结果作为所需的OP。他说我会按照预期得到未删除和未批准的项目。这和上面的回答结果是一样的。我做了,但它没有给我任何东西。项目可能同时标记为已删除和未批准。此外,要求检索所有未删除的项目和未批准的项目,而不仅仅是未删除或未批准的项目。请参见我的屏幕截图。我找回了3件物品。它们都是未删除和未批准的。&&是您想要的。如果你得到不同的结果,你需要在你的帖子中显示完整的代码。您的表或数据可能有误。