Tengo una consulta LINQ compleja (utilizando LINQ 2 EF) que puede devolver resultados duplicados y estoy utilizando el método .Distinct()
para evitar duplicados. Aquí está el esqueleto:LINQ Seleccione Distinct al ignorar el campo XML
var subQuery1 = // one query...
var subQuery2 = // another query...
var result = subQuery1.Distinct().Union(subQuery2.Distinct()).ToArray();
Cada una de las sub consultas se unen a una tabla de usuario común con otra mesa y realizar una 'dónde' consulta, los resultados se combinaron más adelante en el .Union(...)
. Esto funcionó bien hasta que la tabla se modificó para incluir una columna XML, lo que resulta en esta excepción:
el tipo de datos xml no se puede seleccionar como distinta porque no es comparable
En este caso I no importa si la columna XML es equivalente en todos los resultados. de hecho, solo necesito estar seguro de que la clave principal UserId
es distinta en los resultados.
¿Hay alguna manera de usar Distinct()
pero ignore la columna XML o una forma más simple de asegurar que elimine los registros del resultado con el mismo UserId
de una manera eficiente? Idealmente, esto no recuperaría registros duplicados de la base de datos y no requeriría un procesamiento posterior para eliminar los duplicados.
Actualización: he descubierto que si serializar mis consultas a las matrices antes de tiempo, entonces no hay necesidad de ningún tipo de comparador ya Linq2Objects no tiene el problema de selección distinta XML. Por ejemplo, yo puedo hacer esto:
var subQuery1 = // one query...
var subQuery2 = // another query...
var result =
subQuery1.Distinct().ToArray().Union(
subQuery2.Distinct().ToArray())
.ToArray();
Así que lo que realmente estoy buscando es una manera de evitar la serialización de las consultas intermedias y hacer un Linq2Entities llamar directamente que no se devolverán los registros duplicados con UserId
s. Gracias por todas las respuestas hasta el momento.
No es una respuesta al problema exacto, pero en el caso de que en general, si desea 'Distinct' junto con alguna concatenación, use directamente' Union'. Establecer operaciones como 'Unión',' Excepto', 'Intersecar' etc. elimina duplicados de todos modos. Entonces en su caso, simplemente: 'subQuery1.Union (subQuery2) .ToArray()' – nawfal