miércoles, 22 de diciembre de 2010

Distinct en linq. Con IQueryables.

Esta es una continuación al post inicial Distinct en linq que escribí en octubre del 2010.

Cuando nos encontramos que queremos hacer un distinct a un IQueryable, nos encontramos que dá un error de sobrecarga… por lo cual la salida más rápida que he encontrado (dadas las horas de la noche que son) es convertir dicha IQueryable en un IEnumerable, que funciona de vicio.

    IQueryable<vias> listaDeVias = (from via in pDataContext.vias
where via.nombre.Contains(pNombreVia) &&
via.id_pobl == 41
orderby via.nombre, via.nombre.Length
select via).Take(30);


IEnumerable<vias> viasFinal = listaDeVias.ToList().Distinct(new CodPostal_tComparer());



Y la clase del comparador, con el hash mucho más elaborado

public class CodPostal_tComparer : IEqualityComparer<Entidades.CodPostal_t_SQL>
{
public bool Equals(Entidades.CodPostal_t_SQL x, Entidades.CodPostal_t_SQL y)
{
if (x.nombre == y.nombre && x.id_tipo_v == y.id_tipo_v)
{
return true;
}
return false;
}
public int GetHashCode(Entidades.CodPostal_t_SQL obj)
{
int hashCalleNombre = obj.nombre == null ? 0 : obj.nombre.GetHashCode();
int hashCalleTipoVia = obj.id_tipo_v.GetHashCode();

//Devuelvo la unión de ambos código hash.
return hashCalleNombre ^ hashCalleTipoVia;
}
}



Espero que os sea de utilidad tanto como a mí.




No hay comentarios: