2011-10-14 19 views
13

LINQおよび複数の結合に関する多数のポストがあります。 しかし、私が作ってみたいと思っていることはありません。LINQ to Entity:複数の結合条件

SELECT * FROM table1 a 
LEFT JOIN table2 b ON a.col1 = b.key1 AND 
a.col2 = b.key2 AND 
b.from_date <= now() AND 
b.deleted = 0; 

ここで私は、私は日付ののadditonal条件を追加することがどのように

var query = (from x in context.table1 
      join y in context.table2 on new {x.col1, x.col2} equals {b.key1, b.key2} 
      into result 
      from result...... 

を試みたし、削除した数多くのLINQクエリの一つです:

SQL同等物は、このようなものになるだろうフラグ? .Where条件を使用すると、これは左結合ではなく内部結合として扱われます。

答えて

32

もう一つの方法は、

var query = (from x in context.table1 
      join y in context.table2 on 
      new { 
        Key1 = x.col1, 
        Key2 = x.col2 
        Key3 = true, 
        Key4 = true 
       } 
      equals 
      new { 
        Key1 = y.key1, 
        Key2 = y.key2, 
        Key3 = y.from_date< DateTime.Now, 
        Key4 = !y.deleted 
       } 
      into result 
from r in result.DefaultIfEmpty() 
select new {x.Something, r.Something} 
1

2番目のクエリで1番目の結果セットをフィルタリングできませんか?

var query = (from x in context.table1 
      join y in context.table2 on new {x.col1, x.col2} equals {b.key1, b.key2} 
      into result 
query = from x in query 
     where ... 

それは機能しますか?

11

ようなことができLINQは両方をサポートし、構文と古いANSI-82構文に参加します。後で使用すると、あなたの探していることをすることができます

var nowTime = DateTime.Now; 
var query = from a in context.table1 
      from b in context.table2 
      where a.col1 == b.key1 
       && a.col2 == b.key2 
       && b.from_date < nowTime 
       && b.deleted == false 
      select ???; 

また、whereとjoinのハイブリッドを使用できます。 (LINQクエリ内の順序は、SQLで行うだろうと順番は、より柔軟性があるものを模倣する必要はありませんことを実現しています。)

var nowTime = DateTime.Now; 
var query = from b in context.table2 
      where b.from_date < nowTime 
       && b.deleted == false 
      join a on new {b.key1, b.key2} equals new {a.col1, a.col2} 
      select ???; 
0

私は匿名オブジェクトのプロパティの命名に問題があった:

var subscriptions = context.EmailSubscription.Join(context.EmailQueue, 
        es => new { es.Id, 9 }, 
        eq => new { eq.EmailSubscriptionId, eq.EmailTemplateId }, 
        (es, eq) => new { es.Id, eq.Id } 
       ).ToList(); 

コンパイラは幸せではなかったので、私は何が間違っていたのか理解しやすくなりました。それは私に愚かな間違いを見つけるのにいくつかの時間がかかりました:):

var subscriptions = context.EmailSubscription.Join(context.EmailQueue, 
        es => new { EmailSubscriptionId = es.Id, EmailTemplateId = 9 }, 
        eq => new { eq.EmailSubscriptionId, eq.EmailTemplateId }, 
        (es, eq) => new { es.Id, eq.Id } 
       ).ToList();