2008-12-15 92 views

Trả lời

7

Bạn có thể thử:

var yIds = from y in dataContext.Y 
      where ... 
      select y.XId; 

var query = from x in dataContext.X 
      where yIds.Contains(x.Id) 
      select x; 

Tôi không biết liệu nó sẽ làm việc mặc dù - bất kỳ lý do tại sao bạn không muốn chỉ làm một tham gia để thay thế? Ví dụ:

var query = from x in dataContext.X 
      join y in dataContext.Y.Where(...) on x.Id equals y.Xid 
      select x; 
+2

Cần có một "người khác là gõ chính xác câu trả lời tương tự như bạn "popup trạng thái trên trang web này :) –

+1

Lý do không tham gia: Nếu x là 1 đến nhiều với y, tham gia sẽ cung cấp cho nhân đôi x. –

+0

@DavidB: Đúng. Tôi tự hỏi những gì thêm một cuộc gọi đến Distinct() ở cuối sẽ làm ... –

8

Để thực hiện IN trong sql, bạn cần sử dụng hàm Chứa trong LINQ.

Vì vậy, ví dụ:

var query = from x in GetX() 
      where (from y in GetY() select y.xID).Contains(x.xID) 
      select x; 

Bạn cũng có thể xác định các truy vấn LINQ bên trong riêng rẽ nếu bạn thích, đó là có thể đọc được

+0

Điều này có nghĩa là gì đối với hiệu suất? Sẽ có một sự khác biệt trong việc xác định các truy vấn contra sử dụng nó nội tuyến? – Dimse

+0

Không có sự khác biệt nào cả. –

5

tôi đang tìm kiếm một giải pháp NOT IN cho LINQ to SQL hơn một chút. Cảm ơn cho câu hỏi này tôi đã có thể google điều đúng đắn và tìm bài viết trên blog này: The NOT IN clause in LINQ to SQL

C#

NorthwindDataContext dc = new NorthwindDataContext(); 
var query = 
    from c in dc.Customers 
    where !(from o in dc.Orders 
      select o.CustomerID) 
      .Contains(c.CustomerID) 
    select c; 

VB.net

Dim db As New NorthwinDataContext() 
Dim query = From c In dc.Customers _ 
      Where Not (From o in dc.Orders _ 
         Select o.CustomerID).Contains(c.CustomerID) _ 
      Select c 
+0

câu trả lời này đã giúp tôi rất nhiều, cảm ơn! Tôi có một thiết lập lớp học trong đó một lớp có một Danh sách (trong Class2) trong đó có một Danh sách (Of Class3) (bắt chước một container, hàng nhận phiếu, và hàng hóa nhận phiếu mua hàng tại cơ sở kho). Cần phải tìm một cách để tìm một phần cụ thể trong Class3 trong khi bắt đầu ở Class1 mà không cần cho mỗi vòng lặp thông qua mỗi cá thể lớp. Điều này làm việc tuyệt vời (không có Không cho tôi)! – RianBattle

Các vấn đề liên quan