Как вы делаете IN или CONTAINS в LINQ, используя выражения LAMBDA? - PullRequest
6 голосов
/ 09 декабря 2008

У меня есть следующий Transact-Sql, который я пытаюсь преобразовать в LINQ ... и изо всех сил.

SELECT * FROM Project
WHERE Project.ProjectId IN (SELECT ProjectId FROM ProjectMember Where MemberId = 'a45bd16d-9be0-421b-b5bf-143d334c8155')

Любая помощь будет принята с благодарностью ... Я хотел бы сделать это с лямбда-выражениями, если это возможно.

Заранее спасибо!

Ответы [ 4 ]

6 голосов
/ 09 декабря 2008

GFrizzle побил меня к этому. Но вот версия C #

var projectsMemberWorkedOn = from p in Projects
                    join projectMember in ProjectMembers on
                        p.ProjectId equals projectMember.ProjectId
                    where projectMember.MemberId == "a45bd16d-9be0-421b-b5bf-143d334c8155"
                    select p;

И, в качестве бонуса, также чисто цепная версия метода LINQ:

var projectsMemberWorkedOn =
            Projects.Join( ProjectMembers, p => p.ProjectId, projectMember => projectMember.ProjectId,
                ( p, projectMember ) => new { p, projectMember } )
                .Where( @t => @t.projectMember.MemberId == "a45bd16d-9be0-421b-b5bf-143d334c8155" )
                .Select(@t => @t.p );
5 голосов
/ 09 декабря 2008

В этом контексте вы можете просто использовать .Contains (), что-то вроде этого:

var projects = 
from p in db.Projects
where db.ProjectMembers.Where(m => m.MemberId == "a45bd16d-9be0-421b-b5bf-143d334c8155").Select(pp => pp.ProjectID).Contains(p.ProjectID)
select p;
4 голосов
/ 09 декабря 2008

Лямбда не нужна, вы только что присоединились к LINQ:

From p in db.Projects _
Join m in db.ProjectMember On p.ProjectId Equals m.ProjectId _
Where m.MemberId = "a45bd16d-9be0-421b-b5bf-143d334c8155" _
Select p
3 голосов
/ 09 декабря 2008

Возможно, вам нужен оператор Any () :

var q = db.Projects
          .Where(p => db.ProjectMembers
                        .Where(pm => pm.MemberId == memberId)
                        .Any  (pm => p.ProjectId == pm.ProjectId)); 

Поскольку результирующий набор db.ProjectMembers.Where(...) всегда будет одинаковым, его можно разделить так, чтобы он выполнялся только один раз:

var projectMembers = db.ProjectMembers.Where(pm => pm.MemberId == memberId);
var q              = db.Projects
                       .Where(p  => projectMembers
                                    .Any(pm => p.ProjectId == pm.ProjectId));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...