2011-06-01 25 views
4

我試圖如何使用DbLinq和SQLite進行左外連接?

db.Table1.GroupJoin(db.Table2, 
    t1 => t1.Id, 
    t2 => t2.t1Id, 
    (t1,g) => new { t1, g }) 
    .Where(item => !item.g.Any()) 
    .Select(item => item.t1); 

但它返回0的結果。我想寫生成以下SQL代碼(或類似的東西)

SELECT t1.* 
FROM Table1 as t1 
LEFT OUTER JOIN Table2 as t2 
ON t1.Id = t2.t1Id 
WHERE IsNull(t2.Id); 

回答

3

它看起來像你期望的結果是,以確定從Table1是有左外期間沒有結果與Table2參加項目的東西。

用流利的表示法,這種方法將類似於此:

var query = db.Table1.GroupJoin(db.Table2, 
       t1 => t1.Id, 
       t2 => t2.t1Id, 
       (t1, joined) => new { t1, joined } 
      ) 
      .SelectMany(r => r.joined.DefaultIfEmpty(), (r, j) => new 
      { 
       r.t1, 
       j 
      }) 
      .Where(r => r.j == null) 
      .Select(r => r.t1); 

在查詢語法:

var query = from t1 in db.Table1 
      join t2 in db.Table2 on t1.Id equals t2.t1Id into joined 
      from j in joined.DefaultIfEmpty() 
      where j == null 
      select t1;