2016-10-21 25 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