Левое соединение на основе метода Linq с несколькими критериями

#c# #linq

#c# #linq

Вопрос:

Как я могу получить аналогичный запрос Linq, как этот SQL-запрос, используя метод 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.Динамические требования.

Отображение выглядит следующим образом: введите описание изображения здесь

Я начал с этого, но я не знаю, как ограничить 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();
  

Ответ №1:

Код взят из моей головы, но смысл в том, чтобы использовать 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();
  

Также вы можете ограничить, AF_Principal используя Where предложение (я думаю, что движок СУБД в любом случае оптимизирует запрос)

Комментарии:

1. Это запрос не на основе метода

2. @ebelair вы можете изменить свой Join на 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

Ответ №2:

посмотрим, сработает ли это

  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();
  

Комментарии:

1. Это запрос не на основе метода

Ответ №3:

Я думаю, что нашел запрос:

 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();