Mi única preocupación sobre LINQ es con su implementación de combinaciones.
Como determiné al intentar responder this question (y está confirmado here), el código que LINQ genera para realizar las uniones es (necesariamente, supongo) ingenuo: para cada elemento de la lista, la unión realiza una búsqueda lineal a través del lista unida para encontrar coincidencias.
Agregar una unión a una consulta LINQ básicamente convierte un algoritmo de tiempo lineal en un algoritmo de tiempo cuadrático. Incluso si piensa que la optimización prematura es la raíz de todo mal, el salto de O (n) a O (n^2) debería darle una pausa. (Es O (n^3) si se une a través de un elemento unido a otra colección, también.)
Es relativamente fácil evitar esto.Por ejemplo, esta consulta:
var list = from pr in parentTable.AsEnumerable()
join cr in childTable.AsEnumerable() on cr.Field<int>("ParentID") equals pr.Field<int>("ID")
where pr.Field<string>("Value") == "foo"
select cr;
es análogo a cómo uniría dos tablas en SQL Server. Pero es terriblemente ineficiente en LINQ: para cada fila primaria que devuelve la cláusula where
, la consulta escanea toda la tabla secundaria. (Incluso si se está uniendo en un campo no indexado, SQL Server va a construir una tabla hash para acelerar la unión si se puede Eso es un poco fuera de nivel de pago de LINQ..)
Esta consulta, sin embargo:
string fk = "FK_ChildTable_ParentTable";
var list = from cr in childTable.AsEnumerable()
where cr.GetParentRow(fk).Field<string>("Value") == "foo"
select cr;
produce el mismo resultado, pero escanea la tabla secundaria solo una vez.
Si usa LINQ para objetos, se aplican los mismos problemas: si desea unir dos colecciones de cualquier tamaño significativo, probablemente deba considerar la implementación de un método más eficiente para encontrar el objeto unido, por ejemplo:
Dictionary<Foo, Bar> map = buildMap(foos, bars);
var list = from Foo f in foos
where map[f].baz == "bat"
select f;
no especifica qué sabor .... LINQ to Objects? LINQ a XML? LINQ to SQL? Los dos primeros estoy de acuerdo contigo, el último que no uso. –