2008-12-09 6 views
6

Tôi có Transact-Sql sau đây mà tôi đang cố chuyển đổi sang LINQ ... và đang gặp khó khăn.Làm thế nào để bạn thực hiện IN hoặc CONTAINS trong LINQ bằng cách sử dụng các biểu thức LAMBDA?

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

Bất kỳ trợ giúp nào sẽ được đánh giá cao ... Tôi muốn làm điều đó với biểu thức Lambda, nếu có thể.

Cảm ơn trước!

Trả lời

6

GFrizzle đánh tôi với nó. Nhưng đây là một C# phiên bản

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; 

Và như một phần thưởng một hoàn toàn LINQ chuỗi phương pháp phiên bản cũng như:

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

Trong bối cảnh này, bạn chỉ có thể sử dụng Chứa(), một cái gì đó như thế này:

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

Không cần cho một lambda, bạn vừa có một LINQ đơn giản tham gia ở đây:

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

Tùy thuộc vào cách ProjectMember được cấu trúc, điều này có thể trả về bản sao. –

+0

Điểm tốt. Nếu đó là một khả năng, bạn có thể bọc LINQ trong "(...). Riêng biệt", hoặc sử dụng một nhóm Tham gia vào ProjectMember và bao gồm "... Into pmGroup Where pmGroup.Count> 0". – gfrizzle

3

Có thể bạn muốn Bất kỳ() điều hành:

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

Vì tập hợp kết quả của db.ProjectMembers.Where(...) sẽ luôn giống nhau, bạn có thể tách nó ra để nó được thực thi chỉ một lần:

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

Khi ai đó chỉ vào một số câu trả lời của tôi. Điều này sẽ thực thi các truy vấn N SQL trong đó N = db.Projects.Count() – Strelok

+0

Nếu bạn đang nhắc đến việc gọi ProjectMembers.Where() mỗi lần, bạn có thể thực hiện điều đó một lần và vì vậy nó sẽ chỉ là tổng số 2 truy vấn. –