2016-10-21 50 views
0

如何使用基於Linq方法的獲得與此SQL查詢類似的Linq查詢?Linq方法基於多條件的左連接

SELECT * FROM F_ARTICLE A 
LEFT JOIN F_ARTFOURNISS AF ON AF.AR_Ref = A.AR_Ref AND AF.AF_Principal = 1 
ORDER BY A.AR_Design DESC 
OFFSET 500 ROWS FETCH NEXT 100 ROWS ONLY 

我使用基於System.Linq.Dynamic需求的方法。

的映射是這樣的: enter image description here

我開始,但我不知道如何來限制AF_Principal = 1:

var query = context.F_ARTICLE 
      .Join(
       context.F_ARTFOURNISS, 
        a => a.AR_Ref, 
        t => t.AR_Ref, 
        (a, t) => new { a, t }) 
      .Select(
       z => new ArticleItem() 
       { 
        Article = z.a, 
        Tarif = z.t.FirstOrDefault() 
       }) 
      .OrderBy($"{field} {direction}"); 

return query.Skip(startIndex).Take(count).ToList(); 

回答

0

我想我找到了查詢:

var query = context.F_ARTICLE 
      .GroupJoin(
       context.F_ARTFOURNISS, 
        a => a.AR_Ref, 
        t => t.AR_Ref,          
        (a, t) => new { a, t }) 
      .Select(
       z => new ArticleItem() 
       { 
        Article = z.a, 
        Tarif = z.t.Where(t=>t.AF_Principal == 1).FirstOrDefault() 
       }) 
      .OrderBy($"{field} {direction}"); 

return query.Skip(startIndex).Take(count).ToList(); 
0

的代碼是從我的頭,但點正在做使用LEFT JOIN DefaultIfEmpty

var query = from farticle in context.F_ARTICLE 
     join b in context.F_ARTFOURNISS 
     on new {farticle.AR_Ref, AF_Principal = 1} equals new {b.AR_Ref, b.AF_Principal} into gj 
     from subres in gj.DefaultIfEmpty() 
     select farticle; 

return query.Skip(startIndex).Take(count).ToList(); 

您也可以通過使用限制條款(我認爲DBMS引擎優化反正查詢)

+0

這不是基於查詢 – ebelair

+0

的方法@ ebelair你可以改變你的'加入'ontext.F_ARTFOURNISS, a => new {a.AR_Ref,AF_Principal = 1}, t => new {t.AR_Ref,t.AF_Principal}, (a,t) => new {a,t})'來限制'AF_Principal'到1 – Michael

0

看看,如果這個工程

var query = from F1 in context.F_ARTICLE join F2 in context.F_ARTFOURNISS 
      on F1.AR_Ref equals F2.AR_Ref into newF 
      from F3 in newF.where(f=>f.AF_Principal == 1).DefaultIfEmpty() 
      select f; 
      return query.Skip(startIndex).Take(count).ToList(); 
+0

這不是一個基於方法的查詢 – ebelair