Как использовать пункт where в EF - PullRequest
0 голосов
/ 29 января 2019

Я хочу сделать запрос, используя 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 ))
)

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Я бы, вероятно, упаковал это в представление или хранимую процедуру (если вам нужны динамические идентификаторы) и загрузил бы это отдельно.

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 # ...

var users = MyDbc.Users.ToList();

... вот так.

0 голосов
/ 29 января 2019

Я думаю, вы ищете это.Вы можете просто сделать обе проверки прямо в первом, где.

d.UserPlans.Where(m => m.IsActive == 1 && 
(m.PlanId == 2 || (m.PlandId == 3 &&
d.UserGroups.FirstOrDefault().Group.AdminId == d.I)))
0 голосов
/ 29 января 2019

Просто используйте встроенный синтаксис запроса:

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, так что вы хороши с производительностью, но читаемость и отказоустойчивость вашего запроса действительно плохие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...