Совсем недавно при разработке проекта с версионностью, я столкнулся с проблемой выборки элементов по списку составных ключей.
Описание проблемы:
При разработке «в условиях» версионности primary key таблиц состоит из Id и Revision. Нужно получить выборку из таблицы БД по передаваемому списку составных ключей (Id, Revision). Такой SQL запрос выглядел бы так (для пяти элементов в списке):
/* Запрос 1 */
select *
from dbo.[Items] i
where (i.Id = 1 and i.Revision = 2)
OR (i.Id = 1 and i.Revision = 4)
OR (i.Id = 3 and i.Revision = 3)
OR (i.Id = 3 and i.Revision = 4)
OR (i.Id = 5 and i.Revision = 9)
Но Entity Framework не позволяет написать такой запрос для списка составных ключей. Максимум что можно сделать стандартными средствами это:
context.Items.Where(i=> idList.Contains(i.Id) && revisionList.Contains(i.Revision))
что превратится в такой запрос (концептуально):
/* Запрос 2 */
select *
from dbo.[Items] i
where i.Id in (1, 3, 5) and i.Revision in (2, 3, 4, 9)
Этот запрос будет выдавать неверные результаты, если таблице Items есть элементы с такими идентификаторами:
Id = 3, Revision = 2
Id = 3, Revision = 4
А в списке составных ключей есть такие строчки:
Id = 5, Revision = 4
Id = 3, Revision = 2
Так как же быть?
Читать полностью »