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