2009-04-12 8 views
1

Étant donné ce code:LINQ to SQL: DISTINCT Types anonymes

dgIPs.DataSource = 
    from act in Master.dc.Activities 
    where act.Session.UID == Master.u.ID 
    select new 
    { 
     Address = act.Session.IP.Address, 
     Domain = act.Session.IP.Domain, 
     FirstAccess = act.Session.IP.FirstAccess, 
     LastAccess = act.Session.IP.LastAccess, 
     IsSpider = act.Session.IP.isSpider, 
     NumberProblems = act.Session.IP.NumProblems, 
     NumberSessions = act.Session.IP.Sessions.Count() 
    }; 

Comment puis-je tirer le Distinct() basé sur l'adresse distincte seulement? C'est-à-dire, si j'ajoute simplement Distinct(), il évalue la ligne entière comme étant distincte et par conséquent ne trouve aucun doublon. Je veux retourner exactement une ligne pour chaque objet act.Session.IP.

J'ai déjà trouvé this answer, mais il semble que ce soit une situation différente. De plus, Distinct() fonctionne bien si je sélectionne simplement act.Session.IP, mais il a une colonne que je souhaite éviter de récupérer et je préfère ne pas avoir à le faire en liant manuellement mes colonnes de données.

Répondre

3
dgIPs.DataSource = 
    from act in Master.dc.Activities 
    where act.Session.UID == Master.u.ID 
    group act by act.Session.IP.Address into g 
    let ip = g.First().Session.IP 
    select new 
    { 
     Address = ip.Address, 
     Domain = ip.Domain, 
     FirstAccess = ip.FirstAccess, 
     LastAccess = ip.LastAccess, 
     IsSpider = ip.isSpider, 
     NumberProblems = ip.NumProblems, 
     NumberSessions = ip.Sessions.Count() 
    }; 

Ou:

dgIPs.DataSource = 
    from act in Master.dc.Activities 
    where act.Session.UID == Master.u.ID 
    group act.Session.IP by act.Session.IP.Address into g 
    let ip = g.First() 
    select new 
    { 
     Address = ip.Address, 
     Domain = ip.Domain, 
     FirstAccess = ip.FirstAccess, 
     LastAccess = ip.LastAccess, 
     IsSpider = ip.isSpider, 
     NumberProblems = ip.NumProblems, 
     NumberSessions = ip.Sessions.Count() 
    }; 
+1

J'ai essayé cette approche et sur le profilage le résultat a révélé qu'il générait de jolies wack SQL – LaserJesus

+0

Brehtt, d'accord. Il semble toujours interroger le db au moins deux fois. –

0

L'une des surcharges de Enumerable.Distinct accepte une instance IEqualityComparer. Il suffit d'écrire une classe qui implémente IEqualityComparer et qui compare uniquement les deux propriétés Address.

Malheureusement, vous devrez donner un nom à la classe anonyme que vous utilisez.

+1

Si je me souviens bien, que la surcharge est pas pris en charge dans LINQ to SQL (car il ne peut pas transférer un IEqualityComparer au serveur), uniquement dans LINQ aux objets. Ainsi, l'affiche devrait également appeler ToList() sur le jeu de résultats avant d'appeler Distinct(). – itowlson