LINQ: Как удалить элемент из IQueryable <T> - PullRequest
9 голосов
/ 30 мая 2010

Как перебрать IQueryable и удалить некоторые ненужные мне элементы.

Я ищу что-то подобное

var items = MyDataContext.Items.Where(x => x.Container.ID == myContainerId);
foreach(Item item in items)
{
  if(IsNotWhatINeed(item))
    items.Remove(item); 
}

Возможно ли это? Заранее спасибо

Ответы [ 5 ]

13 голосов
/ 30 мая 2010

Вы можете запросить это далее, как в этом

var filtered = items.Where(itm => IsWhatINeed(itm));

Также обратите внимание на тонкое изменение в булевой функции на положительную, а не отрицательную. Это (отрицательный) - то, для чего предназначен оператор not.

9 голосов
/ 30 мая 2010
items = items.Where( x => !IsNotWhatINeed(x) );
3 голосов
/ 30 мая 2010
var items = MyDataContext.Items.Where(x => x.Container.ID == myContainerId 
    && !IsNotWhatINeed(x));

или

var items = MyDataContext.Items.Where(x => x.Container.ID == myContainerId) 
    .Where(x=> !IsNotWhatINeed(x));
2 голосов
/ 30 мая 2010

Другие ответы верны в том смысле, что вы можете дополнительно уточнить запрос с помощью оператора 'where'. Тем не менее, я предполагаю, что ваш запрос является запросом Linq2Sql. Поэтому вам необходимо убедиться, что у вас есть данные в памяти перед дальнейшей фильтрацией с помощью пользовательской функции:

var items = MyDataContext.Items.Where(x => x.Container.ID == myContainerId)
    .ToList(); // fetch the data in memory

var itemsToRemove = items.Where(IsNotWhatINeed);

Если вы действительно хотите расширить IQueryable, то функция IsNotWhatINeed должна быть преобразована в нечто, понятное Linq2Sql.

1 голос
/ 30 мая 2010

Попробуйте:

var items = YourDataContext.Items.Where(x => x.Container.ID == myContainerId 
    && !IsNotWhatYouNeed(x));
...