Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何重用EF中的where子句_C#_Linq_Entity Framework 6 - Fatal编程技术网

C# 如何重用EF中的where子句

C# 如何重用EF中的where子句,c#,linq,entity-framework-6,C#,Linq,Entity Framework 6,我想使用EF进行查询,我的查询如下所示 var users = MyDbc.AspNetUsers.Where ( d => ( d.UserPlans.Where(m => m.IsActive == 1).FirstOrDefault().PlanId == 2 ||

我想使用
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)
                  )
            );
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 ))
)
如何避免查询用户计划两次? 在
SQL
中,我将编写以下代码

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)
                  )
            );
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扩展

PS


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

我可能会将其打包到视图或存储过程中(如果您需要动态ID)并单独加载

CREATE VIEW Users
AS   
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 ))
)
GO  
然后用c#调用它


。。。就像那样。

我想你在找这个。你可以直接在第一个地方做两个检查

d.UserPlans.Where(m => m.IsActive == 1 && 
(m.PlanId == 2 || (m.PlandId == 3 &&
d.UserGroups.FirstOrDefault().Group.AdminId == d.I)))

整个Linq查询将转换为一个SQL查询,因此您实际上不会查询两次UserPlans。您可以使用
((System.Data.Entity.Core.Objects.ObjectQuery)查询)轻松检查生成的SQL查询。ToTraceString()
我已经使用profiler检查了查询,似乎我有两个userplan的
外部apply语句