2008-12-09 15 views
6

Mam następujące Transact-Sql, które próbuję przekonwertować do LINQ ... i walczących.Jak zrobić IN lub ZAWIERA w LINQ używając wyrażeń LAMBDA?

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

Każda pomoc byłaby bardzo doceniana ... Chciałbym to zrobić za pomocą wyrażeń Lambda, jeśli to możliwe.

Z góry dziękuję!

Odpowiedz

6

GFrizzle pobił mnie. Ale tutaj jest wersja 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; 

A jako bonus czysto LINQ wersja łańcucha metoda także:

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

W tym kontekście, można po prostu użyć .Contains(), coś takiego:

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

Nie potrzeba lambda, który właśnie dostał proste LINQ przyłączyć tutaj:

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 
+0

zależności od sposobu ProjectMember jest skonstruowany, to może powrócić duplikatów. –

+0

Dobra uwaga. Jeśli jest taka możliwość, możesz zawinąć LINQ w "(...). Distinct" lub użyć Group Join na ProjectMember i dołączyć "... do pmGroup Where pmGroup.Count> 0". – gfrizzle

3

Prawdopodobnie chcą Obojętnie() operator:

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

Ponieważ zestaw wyników db.ProjectMembers.Where(...) zawsze będzie taki sam, można go podzielić tak, aby był wykonywany tylko jeden raz:

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

Jak ktoś wskazał na niektóre z moich odpowiedzi. Spowoduje to wykonanie zapytań N SQL, gdzie N = db.Projects.Count() – Strelok

+0

Jeśli zamierzasz wywoływać metodę ProjectMembers.Where() za każdym razem, możesz wykonać to raz, a więc będzie to tylko 2 zapytania. –