2011-12-14 13 views
2

私は2つのテーブルを持っています。親テーブルには1つの日付列があり、子テーブルには2つの日付列(From/To)があります。私は、親の日付列が子供の1つの間にある親から子への左結合を行う必要があります。 SQLでは、これはこのようになります:linqの "date between"演算子を使用してどのように結合を残しましたか?

select p.cob, count(*) from parent p 
left join child c on p.cob between c.effective and c.expiry 
group by p.cob 

どのように1個の書き込みこのLINQで - 私は私が正しくあなたの質問を読んでいる場合ビットは、

+0

このクエリは非常に悪いです。 –

+0

@BrianHoover - これはなぜ「非常に悪い」でしょうか?それは時変関係のための通常の構造です。 – MatBailie

+0

@Dems子と親の間にデカルト結合を与えるためです。 –

答えて

4

これは、あなたが

var query = from p in context.Parent 
      from c in context.Child.Where(x => p.cob >= x.effective) 
            .Where(x => p.cob <= x.expiry) 
            .DefaultIfEmpty() 
      group p by p.cob into pg 
      select new 
      { 
       cob = pg.Key, 
       count = pg.Count() 
      }; 
+0

これは私が必要とするところで機能しますが、プロファイラがSQLサーバに送られたむしろ大きくて醜いクエリを表示しているため、クエリのパフォーマンスが懸念される可能性があります。これがどのようにスケールアウトされるのかがわかります。これらのテーブルはかなり大きくなるでしょう。 – macsux

0

....ここ間にこだわっています部品はこのように扱われます。

where p.cob >= c.effective and p.cob <= c.expiry 
0

探しているものである必要があり、私は左を作る必要があり、親から子への参加

表現するための複数の方法が常にありますSQLの要件と私は同じことが確かですlinqの真実です

SELECT p.cob, COUNT(*) 
    FROM parent p 
WHERE EXISTS (
       SELECT * 
       FROM child c 
       WHERE p.cob BETWEEN c.effective AND c.expiry 
      ) 
GROUP 
    BY p.cob 
UNION 
SELECT p.cob, 0 
    FROM parent p 
WHERE NOT EXISTS (
        SELECT * 
        FROM child c 
        WHERE p.cob BETWEEN c.effective AND c.expiry 
       ); 

良いオプティマイザは

0

旧など、2つのunion'dテーブルは相互に排他的であることを、繰り返し派生テーブルを見つけるだろうが、多分それは他人のために参考になっなります。それは、特定の量のテストデータに対して、私のクエリを7倍速くしました!

私はそれはとてもすべての残りの部分は、データ量が少ない上で動作結合の結果を作成した後、他の条件をチェックし、私はこの(4seconds)にそれを変更し

from st in subtable 
join t in table on new { parent = st.IdTable, from = 1, to = 1 } equals new { parent = t.Id, from = (t.date >= myStartDate ? 1 : 0), to = (t.date <= myEndDate ? 1 : 0) 
Where st == some_other_conditions 
select st 

を(28seconds)

from st in subtable 
join t in table on st.IdTable equals t.Id 
Where t.date >= myStartDate 
&& t.date <= myEndDate 
&& st == some_other_conditions 
select st 

を持っていました。

希望します。

関連する問題