sintaxis different linq linq-to-sql

different - select linq c# list



Múltiple cláusula WHERE en Linq (4)

@Jon: Jon, ¿estás diciendo que usa cláusulas multiple where?

var query = from r in tempData.AsEnumerable() where r.Field<string>("UserName") != "XXXX" where r.Field<string>("UserName") != "YYYY" select r;

es más reparador que usar

var query = from r in tempData.AsEnumerable() where r.Field<string>("UserName") != "XXXX" && r.Field<string>("UserName") != "YYYY" select r;

Creo que son equivalentes en cuanto al resultado.

Sin embargo, no he probado, si se usa multiple donde en el primer ejemplo, causa en 2 subconsultas, es decir, .Where(r=>r.UserName!="XXXX").Where(r=>r.UserName!="YYYY) o el traductor LINQ es lo suficientemente inteligente para ejecutar .Where(r=>r.UserName!="XXXX" && r.UsernName!="YYYY")

Soy nuevo en LINQ y quiero saber cómo ejecutar cláusula where múltiple. Esto es lo que quiero lograr: devolver registros filtrando ciertos nombres de usuario. Probé el código siguiente pero no funcionó como esperaba.

DataTable tempData = (DataTable)grdUsageRecords.DataSource; var query = from r in tempData.AsEnumerable() where ((r.Field<string>("UserName") != "XXXX") || (r.Field<string>("UserName") != "XXXX")) select r; DataTable newDT = query.CopyToDataTable();

¡¡¡Gracias por la ayuda por adelantado!!!


@Theo

El traductor LINQ es lo suficientemente inteligente como para ejecutar:

.Where(r => r.UserName !="XXXX" && r.UsernName !="YYYY")

He probado esto en LinqPad ==> SÍ, el traductor de Linq es lo suficientemente inteligente :))


Además, puedes usar el (los) método (s) bool

Consulta :

DataTable tempData = (DataTable)grdUsageRecords.DataSource; var query = from r in tempData.AsEnumerable() where isValid(Field<string>("UserName"))// && otherMethod() && otherMethod2() select r; DataTable newDT = query.CopyToDataTable();

Método:

bool isValid(string userName) { if(userName == "XXXX" || userName == "YYYY") return false; else return true; }


Bueno, puedes poner varias cláusulas "donde" directamente, pero no creo que quieras. Múltiples cláusulas "donde" terminan con un filtro más restrictivo, creo que quiere uno menos restrictivo. Creo que realmente quieres

DataTable tempData = (DataTable)grdUsageRecords.DataSource; var query = from r in tempData.AsEnumerable() where r.Field<string>("UserName") != "XXXX" && r.Field<string>("UserName") != "YYYY" select r; DataTable newDT = query.CopyToDataTable();

Tenga en cuenta el && en lugar de ||. Desea seleccionar la fila si el nombre de usuario no es XXXX y el nombre de usuario no es YYYY.

EDITAR: si tienes toda una colección, es aún más fácil. Supongamos que la colección se llama ignoredUserNames :

DataTable tempData = (DataTable)grdUsageRecords.DataSource; var query = from r in tempData.AsEnumerable() where !ignoredUserNames.Contains(r.Field<string>("UserName")) select r; DataTable newDT = query.CopyToDataTable();

Idealmente, querría hacer de este un HashSet<string> para evitar que la llamada de Contains tome mucho tiempo, pero si la colección es lo suficientemente pequeña no tendrá muchas probabilidades.