2009-07-21 32 views
12

Tôi muốn thực hiện JOIN với LINQ bằng câu lệnh OR.LINQ tham gia với OR

Dưới đây là các truy vấn SQL tôi bắt đầu với:

SELECT t.id 
FROM Teams t 
INNER JOIN Games g 
    ON (g.homeTeamId = t.id OR g.awayTeamId = t.id) 
    AND g.winningTeamId != 0 
    AND g.year = @year 
GROUP BY t.id 

Tôi đang gặp rắc rối chuyển đổi mà ON khoản để LINQ. Đây là nơi tôi đang ở:

var y = from t in db.Teams 
     join g in db.Games on t.ID equals g.AwayTeamID //missing HomeTeamID join 
     where g.WinningTeamID != 0 
      && g.Year == year 
     group t by t.ID into grouping 
     select grouping; 

Tôi nghĩ rằng tôi có thể sử dụng:

join g in db.Games on 1 equals 1 
where (t.ID == g.HomeTeamID || t.ID == g.AwayTeamID) 

và các công trình này, nhưng dường như loại dường như hacky. Có cách nào tốt hơn?

Trả lời

2

Điều khoản where áp dụng điều kiện boolean, vì vậy hãy sử dụng "||" là con đường để đi. Bạn có thể chuỗi nhiều mệnh đề nhưng tôi tin rằng sẽ cung cấp cho bạn một "và" hoạt động, chứ không phải là một "hoặc".

+1

Tôi chắc chắn muốn sử dụng || nhưng tôi đã hy vọng tôi có thể đặt nó trong JOIN. Tôi đã không thực hiện nó chưa thử nghiệm những gì đầu ra sql là nhưng tôi có nó biên dịch với 1 bằng 1 trong tham gia và tuyên bố OR của tôi xuống trong mệnh đề where. – AndyMcKenna

15

tôi vật lộn với điều này cũng cho đến khi tôi tìm thấy giải pháp sau đây, mà làm việc tốt cho tình hình của tôi:

var y = from t in db.Teams 
     from g in db.Games 
     where 
     (
      t.ID == g.AwayTeamID 
      || t.ID == g.HomeTeamID 
     ) 
      && g.WinningTeamID != 0 
      && g.Year == year 
     group t by t.ID into grouping 
     select grouping; 

Dưới sự bao trùm, giải pháp của bạn có thể hoạt động rất gần thế này. Tuy nhiên, tôi đặt cược cái này nhanh hơn một chút nếu bạn đánh giá nó vì nó KHÔNG THAM GIA mọi mục trong tập dữ liệu đầu tiên với mọi mục trong tập dữ liệu thứ hai, có thể là thảm họa nếu tập dữ liệu (hoặc cả hai) thực sự lớn.

+0

Liệu nó có thực sự tham gia MỌI mục của hai bảng trong giải pháp của OP không? Sẽ không phải là 'nơi' ảnh hưởng đến nó mà chỉ những người đáp ứng các điều kiện sẽ tham gia ...? –

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