c# - 如何在 EF 中重用 where 子句

标签 c# linq entity-framework-6

我想使用 EF 进行查询,我的查询如下所示

var users = MyDbc.AspNetUsers.Where
            (
                  d => 
                  (
                      d.UserPlans.Where(m => m.IsActive == 1).FirstOrDefault().PlanId == 2
                      ||
                      (d.UserPlans.Where(m => m.IsActive == 1).FirstOrDefault().PlanId == 3 
                        && d.UserGroups.FirstOrDefault().Group.AdminId == d.Id)
                  )
            );

如何避免查询 UserPlans 两次? 在 SQL 中,我将编写以下内容

SELECT * FROM AspNetUsers U INNER JOIN UserPlan UP ON U.Id = UP.UserId 
WHERE UP.IsActive = 1
AND (
PlanId=2 OR (PlanId=3 AND EXISTS(SELECT 1 FROM [Group] WHERE AdminId=U.Id ))
)

最佳答案

只需使用内置的查询语法:

var users = from user in MyDbc.AspNetUsers
            from plan in user.UserPlans.Where(m=>m.IsActive == 1)
            where plan.PlanId == 2 || plan.PlanId == 3 && ...

在选择查询时间变量方面更加敏捷。当您的查询变大时,它更具可读性。对于简单的查询,我个人仍然使用纯 LINQ 扩展。

附言

正如 @juharr 在评论中提到的,您的查询可能会被 SQL 提供程序优化,因此您的性能很好,但查询的可读性和容错性确实很差。

关于c# - 如何在 EF 中重用 where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54421163/

相关文章:

c# - 使用 LINQ : XML to object? 时是否可以获得除 IEnumerable<T> 以外的其他集合

entity-framework-6 - 如何让 UWP Uninstall 完全删除数据库?

asp.net - Oracle Managed Dataacess EF6 自定义 edm 映射不适用

c# - 将 CaSTLe.Windsor 与 SSW Data Onion 一起用于 Entity Framework 6

c# - 使用 OracleCommand 执行 pl/sql 函数

c# - 尝试为 StudentId=1 获取 "Grade"时出错

.net - 如何从 VB.NET 中的匿名类型获取属性

c# - 检查附加对象是否有任何基于导航属性的相关数据库

c# - Server.Transfer() 与。服务器.执行()

c# - 是否可以拥有动态的动态部署项?