2013-07-11 2 views
1

У меня есть сущность, чья ссылка представляет собой совокупность идентификатора и среды. Я хочу реализовать функцию, позволяющую пользователю передавать список кортежей (ID, Environment) и возвращать требуемые объекты. Можно ли использовать Contains() в таких сценариях? Как? С простой ссылкой, это так просто, какИспользование кортежей с Entity Framework Содержит оператор

model.MyEntities.Where(e => myIds.Contains(e.Id)) 

EDIT: Для того, чтобы уточнить, я не ищу, как использовать Содержит() метод, чтобы получить список идентификаторов; строка, которую я написал выше, делает это. Я ищу, чтобы иметь возможность получить список сущностей, соответствующих кортежам (ID, среда), а не только ID.

+1

http://stackoverflow.com/questions/6912733/linq-to-entities-where-in-clause -with-multiple-columns - я бы сказал, что ваш лучший выбор - это 'Union()' запросы для идентификаторы вместе и надеюсь, что оптимизатор SQL может это понять. – millimoose

+1

Другим вариантом будет использование LinqKit для динамической сборки цепочки 'OR'. – millimoose

ответ

1

Последняя версия Entity Framework позволяет вам делать Contains по массиву примитивных типов (я думаю, что теперь это работает и на IEnumerable, я не пробовал).

Если вы подходите только на вашем Id (т.е. ваш матч хорошо, если один из ID Кортеж является MyEntity.Id, это будет работать (я использую Tuple losely здесь ваше дело, как представляется, реальный объект; Tuple имеет только ItemN свойства):.

var containedIds = yourListOfTuples.Select(t => t.Id).ToArray(); 
model.MyEntities.Where(e => containedIds.Contains(e.Id)); 

Это позволит эффективно воплотить в WHERE ... IN ([the Ids in containedIds]) заявление в SQL

+1

Чтобы увеличить это, важно преобразовать кортежи в нормальный массив, потому что EF не может преобразовать кортеж в SQL по своей сути. –

+0

@MystereMan Правильно. Я указал «массив примитивных типов», но я должен был быть более явным. –

+0

Я просто хотел сделать это ясно, это хороший ответ. –

Смежные вопросы