Лямбда-выражение для запроса массива KeyValuePairs с использованием Expression <Func <T, bool >> - PullRequest
0 голосов
/ 02 сентября 2011

У меня есть массив KeyValuePairs, подобный этому:

KeyValuePair<long,int>[] orderItems;

'Длинный' компонент этого KeyValuePair соответствует значению Id (первичного ключа) в таблице базы данных.

ИспользованиеВ Entity Framework я определил репозиторий, который предоставляет следующий интерфейс в своем интерфейсе:

IEnumerable<T> GetMany(Expression<Func<T, bool>> where);    

Приведенный выше метод репозитория позволяет мне запрашивать базу данных, используя лямбда-выражения.Например, если я хочу запросить базу данных для всех строк, где столбец «Категория» равен «Камеры», я могу сказать следующее:

var results = repository.GetMany(a => a.Category.Contains("Cameras")).ToList();

Я хочу запросить все строки, где Id (Первичный ключ) равно значению Key из любого элемента массива KeyValuePairs.Поэтому, если список KeyValuePairs представляет собой список идентификаторов продуктов и их количества, я просто хочу запросить в базе данных все продукты, идентификаторы которых есть в моем массиве.

Может ли кто-нибудь найти подходящее лямбда-выражение?

** РЕДАКТИРОВАТЬ В ОРИГИНАЛ

Предложение использовать:

var results = repository.GetMany(a => keys.Any(x => x == a.Id)).ToList(); 

является хорошим и будет работать, если я сначала создам массив ключейиз массива KeyValuePair.Так что-то вроде этого:

long[] pids = new long[orderItems.Length];

for (int i = 0; i < orderItems.Length; i++ )
{
    pids[0] = orderItems[i].Key;
}
var products = productRepository.GetMany(a => pids.Any(x => x == a.Id)).ToList();    

Это показывает, что предложение 'Any' поддерживается EF.Я все еще не могу заставить это работать без использования массива longs все же.Престижность любому достаточно умному, чтобы дать решение, которое не требует, чтобы я сначала извлек значение 'key' из KeyValuePair в массив.

Если я использую ключи. Любое, я получаю следующее исключение:

"Невозможно создать постоянное значение типа 'System.Collections.Generic.IEnumerable`1'. Только примитивные типы (например, Int32, String и Guid) поддерживаются в этом контексте "

Ответы [ 2 ]

2 голосов
/ 02 сентября 2011

Попробуйте это:

var keys = orderItems.Select(x => x.Key).ToList();
var results = repository.GetMany(a => keys.Any(x => x == a.Id))
                        .ToList();  
1 голос
/ 02 сентября 2011

Трудно использовать метод GetMany, в то время как EF в этом случае работает с базой данных.Но у вас должен быть объект запроса, названный в честь ваших сущностей - я возьму здесь Категории (как объект запроса типа с идентификатором поля / свойства) в качестве примера.Затем вы можете сделать:

var query = context.Categories;
foreach(var pair in orderedItems)
  query = query.Union(context.Where(categorie => categorie.Id = pair.Key));

и, наконец, использовать запрос:

var results = query.ToList();

PS: чтобы использовать это с вашим шаблоном репозитория, вы можете просто представить эту коллекцию queryable как IQueryable внутри вашегоинтерфейс репозитория (или создайте унаследованный интерфейс из вашего общего репозитория, например, ICategoryRepository)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...