2010-02-19 20 views
9

No sé cómo puedo hacer varias uniones con una distinta.Linq a entidades: Uniones + Distintas

Cuando uso .Distinct con un IEqualityComparer una excepción en Lanza:

LINQ a Entidades no reconoce el método 'System.Linq.IQueryable'

Mi código es

var union = query.Union(query1).Union(query2); 
union = union.Distinct(new EqualityComparerTransaction()); 

Respuesta

10

LINQ to Entities no admite la sobrecarga de Distinct que toma un IEqualityComparer. Cuando lo piensas, realmente no puede, porque las consultas de LINQ to Entities se convertirán a SQL, y no puedes convertir una referencia de interfaz a SQL.

Por lo tanto, usted debe:

  1. Utilice la sobrecarga de Distinct que no tiene ninguna comparación o
  2. Llevar ambas listas en el espacio objeto y hacer el Distinct en LINQ a objetos, como esto :

    var union = query.Union(query1).Union(query2); 
    union = union.AsEnumerable().Distinct(new EqualityComparerTransaction()); 
    

Naturalmente, el riesgo aquí es que puede traer demasiados r ecords desde el servidor de bases de datos. También puede utilizar estas dos técnicas para hacer una parte de la comparación en el servidor y otra parte en el espacio de objetos.

+0

Gracias por sus respuestas! Creo que voy a utilizar las dos técnicas. Al igual que utilicé una paginación del lado del servidor, no es simple ... – lu2vik

0

Respondió la pregunta, pero solo quiero compartir mi experiencia.

No estoy seguro, pero creo que el mensaje de error va con diciendo que el método Distinct no es compatible con este argumento, creo.

De hecho, lo único que queremos es Linq to SQL, una expresión cuestionable que dice que si estas propiedades son iguales, obtenga una de ellas.

Pero cuando usamos una clase como EqualityComparerTransaction, no se puede traducir a sql normalmente.

Hay otro método GetDistict < T> (string propertyName) Pero lamentablemente no funciona como esperábamos. Este método también va a DB (qué otra cosa es nuestra fuente) y obtener algunos datos y evaluar distintos.

Si el método de extensión GetDistinct (string propertyName) fue la operación de conversión sql Podría ser. Pero no hay forma.

Lamentablemente, la única forma de hacerlo es codificar su propia extensión distinta para LINQ_TO_SQL. ¡No creo que sea fácil! Por lo tanto, parece más fácil en este momento enunciar datos en el lado del servidor.