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语句