/ / C # Linq Select Rows Donde ID es igual a ID en CSV - c #, sql-server, linq, csv

C # Linq Seleccionar filas donde ID es igual a ID en CSV - c #, sql-server, linq, csv

Lo que tengo es una cadena de ID separados por comas que recibo de una cadena de consulta (por ejemplo, 23,51,6,87,29). Alternativamente, esa cadena podría decir "todos".

En mi consulta Linq necesito una forma de decir (en pseudo código):

from l in List<>
where l.Id = all_of_the_ids_in_csv
&& other conditions
select new {...}

Simplemente no estoy seguro de cómo hacerlo. Ni siquiera estoy seguro de qué hacer para que Google vaya en la dirección correcta. Cualquier apuntar en la dirección correcta sería extremadamente útil.

Respuestas

3 para la respuesta № 1

Yo sugeriría dividir su consulta en 2: la primera parte se seleccionará por ID, y la selección seleccionará otras condiciones.

En primer lugar: compruebe si la cadena de consulta contiene números o si sólo all:

var IEnumerable<ListItemType> query = sourceList;

if(queryStringValue != "All")
{
var ids = queryStringValue.Split(new[] { "," })
.Select(x => int.Parse(x)) // remove that line id item.Id is a string
.ToArray();

query = query.Where(item => ids.Contains(item.Id));
}

from l in query
// other conditions
select new {...}

Debido a que las consultas LINQ han diferido de la ejecución, puede generar consultas como esa sin inconvenientes de rendimiento. La consulta no se ejecutará hasta que solicite resultados (por ToList llamada o enumeración).


0 para la respuesta № 2

Si realmente lo quieres con una sola consulta LINQ:

var idArray = all_of_the_ids_in_csv.Split(",");
from l in List<>
where (all_of_the_ids_in_csv == "All" || idArray.Contains(l.Id))
&& other conditions
select new {...}

0 para la respuesta № 3

El truco es usar string.Split

var ids = string.split(rawIdString, ",").ToList();
var objects = ids.Where(id=> /*filter id here */).Select(id=>new { /* id will be the single id from the csv */ });
// at this point objects will be an IEnumerable<T> where T is whatever type you created in the new statement above