У меня есть этот запрос linq:
var query = (from dc in context.Table1.Include(d => d.Doc)
join u in _context.Table2 on dc.IDDoc equals u.IDDoc
where dc.ID == id && u.IDUser == user.IDUser
select dc)
.Union(from dc in context.Table1.Include(d => d.Doc)
join p in _context.Table3 on dc.IDDoc equals p.IDDoc
where dc.ID == id
select dc);
И я хочу добавить больше, когда условия динамически зависят от списка (идентификаторы списка) Чего я хочу добиться, так это:
Представьте, что у меня есть List ids = new(){1, 2, 5, 27); Что я хочу сделать, так это добавить эту информацию в эту часть запроса, чтобы было что-то вроде этого:
.Union(from dc in context.Table1.Include(d => d.Doc)
join p in _context.Table3 on dc.IDDoc equals p.IDDoc
where dc.ID == id && p.ID == 1 || p.ID == 2 || p.ID == 5 || p.ID = 27
select dc)
Но если в следующий раз список будет List ids = new(){4}, запрос должен выглядеть так:
.Union(from dc in context.Table1.Include(d => d.Doc)
join p in _context.Table3 on dc.IDDoc equals p.IDDoc
where dc.ID == id && p.ID == 4
select dc)
Это вообще возможно? Если нет, то какое возможное решение? Спасибо
Обновлено: я составил этот запрос, потому что понятия не имею, как добавить его к моему основному запросу. То, что у меня есть на самом деле, это:
var mainQuery = _context.RootTable
.Include(i => i.Items).ThenInclude(dc => dc.Docs)
.Include(i => i.Items).ThenInclude(sg => sg.Signs)
.FirstOrDefault(m => m.ID== id);
И я хочу отфильтровать «.ThenInclude(dc => dc.Docs) с другим запросом. Я не могу понять, как это сделать лучше и эффективнее, чем с двумя отдельными запросами.
Используйте Enumerable.Contains
:
List<int> ids = new(){4};
....
.Union(from dc in context.Table1.Include(d => d.Doc)
join p in _context.Table3 on dc.IDDoc equals p.IDDoc
where dc.ID == id && ids.Contains(p.ID) // here
select dc)
....
Я бы пригласил вас выпить прямо сейчас. Большое спасибо!!
Вы можете еще больше упростить свою работу, если будете использовать EF Core в качестве ORM вместо встроенного SQL. Вы могли бы избавиться хотя бы от всех JOIN
@Weenhallo не возражал бы против одного, если бы это было возможно) Обратите внимание, что Панайотис очень хорошо говорит об общем подходе к обработке запросов через ORM, такие как EF.
Не могли бы вы сделать мне пример с моим кодом? Я все еще учусь, и иногда мне кажется, что я бьюсь головой о стену
У меня есть этот запрос: var query= _context.RootTable .Include(d=> d.Doc) .Include(m=> m.Markers).ThenInclude(d=> d.Docs) .Include(m=> m.Markers ).ThenInclude(s=> s.Sigs) .FirstOrDefault(d => d.ID == id); Затем я написал другой запрос для фильтрации документов, включенных в маркеры. Было бы здорово, если бы можно было совместить оба, но вчера я попробовал, но безуспешно.
@Weenhallo, если вы используете версию EF Core 5+, вы можете использовать отфильтровано включает, по крайней мере, в некоторых случаях, внимательно прочитайте предупреждение, потому что в некоторых случаях это может дать странные результаты.
Вы действительно должны пересмотреть этот запрос. Вы не используете встроенный SQL, вы используете язык запросов поверх EF Core. Таблиц нет, есть сущности с отношениями. Вам не нужно писать какие-либо JOIN, ORM будет генерировать их из отношений, свойств объектов и коллекций по мере необходимости. Вам также не нужно использовать UNION. В типичном примере блога и сообщений вы можете получить сообщения определенного блога с помощью всего лишь
ctx.Blog.Where(b=>b.ID=123).Select(b=>b.Posts)
. СОЕДИНЕНИЯ не нужны.