2010-05-30 19 views
6

¿Cómo se itera en IQueryable y elimina algunos elementos que no necesito?LINQ: cómo eliminar el elemento de IQueryable <T>

Busco algo como esto

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

¿Es posible? Gracias de antemano

Respuesta

10

Usted debe ser capaz de consultar más que como en este

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

también notar el cambio sutil en la función booleana a una afirmación en lugar de un negativo. Eso (el negativo) es para lo que es el operador not.

+2

Con una función tan optimista y positiva, también puede escribir 'items.Where (IsWhatINeed)'. – Kobi

+0

gracias Anthony y Kobi – Aximili

+1

La versión positiva de una función también elimina el doble escenario negativo: '! IsNotWhatINeed()' –

9
items = items.Where(x => !IsNotWhatINeed(x)); 
+0

Me gustaría agregar que en LINQ, como con todo código funcional, es más preferible obtener una nueva lista de las anteriores mediante la aplicación de un filtro en lugar de hacer cambios en él. – chakrit

3
var items = MyDataContext.Items.Where(x => x.Container.ID == myContainerId 
    && !IsNotWhatINeed(x)); 

o

var items = MyDataContext.Items.Where(x => x.Container.ID == myContainerId) 
    .Where(x=> !IsNotWhatINeed(x)); 
1

Prueba esto:

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

Las otras respuestas son correctas en el que se puede perfeccionar la consulta con un 'dónde' comunicado. Sin embargo, supongo que su consulta es una consulta Linq2Sql. Así que hay que asegurarse de que tiene los datos de la memoria de filtrado antes de seguir con una función personalizada:

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

var itemsToRemove = items.Where(IsNotWhatINeed); 

Si realmente desea extender el IQueryable, entonces la función 'IsNotWhatINeed' debe ser traducido a algo que Linq2Sql entiende .

+0

Gracias jeroenh, podría explicarme o darme un ejemplo de qué es la consulta Linq2Sql y qué entiende Linq2sql por favor? ¡Gracias! – Aximili

Cuestiones relacionadas