2012-11-14 2 views
2

Existe-t-il un moyen de simplifier cela et de le rendre plus rapide? En SQL j'utilise count (*) et count (distinct) dans la même requête qui me donne un résultat plus rapideCombinaison Linq to SQL des fonctions d'agrégat

Merci beaucoup.

int numberOfUsers = (from u in db.UseLogs 
        where u.DocID == docID 
         && u.LogDate >= fromDate 
         && u.LogDate <= to 
        select u.UserID).Distinct().Count(); 

int numberOfVisits = (from u in db.UseLogs 
         where u.DocID == docID 
         && u.LogDate >= fromDate 
         && u.LogDate <= to 
         select u).Count(); 

Conclusion

Il n'y a pas COUNT (DISTINCT) dans LINQ. Toutes les instructions SQL ne peuvent pas être traduites en LINQ.

Merci pour l'aide les gars!

+0

Vous voudrez peut-être simplifier votre question. Tout sauf les deux premières requêtes est inutile pour expliquer la question. Beaucoup d'utilisateurs seront probablement désactivés en devant analyser votre code pour trouver les parties pertinentes (qui ne sont pas nombreuses). – Ocelot20

+0

Merci, n'a pas vu celui-ci jusqu'à présent. Est-ce qu'un maquillage sur le maintenant – Hawk

+0

La réponse courte est Linq2Sql n'a pas de support direct pour count (distinct) –

Répondre

0

Est-ce ce que vous cherchez?

from u in db.UseLogs 
where u.DocId == docId && u.LogDate >= fromDate && u.LogDate <= to 
group u by true into g 
select new 
{ 
    Count = g.Count(), 
    DistinctUserCount = g.Select(x => x.UserId).Distinct().Count() 
} 

Vous voulez vérifier si elle est effectivement plus rapide que l'exécution de deux requêtes, ou si le gain de performance vaut la perte de lisibilité.

+0

Hey, merci de répondre. J'ai aussi essayé celui qui "me regarde" comme serait plus rapide, mais c'est le même chose que d'avoir deux séparés. En SQL, je peux utiliser count (*) et count (distinct) dans la même requête. Mes requêtes sql et linq individuelles nécessitent chacune 7 secondes, alors que celles suggérées et celles que j'ai essayées ont tendance à utiliser 14+. Chaque instruction SQL est-elle possible dans Linq? Merci encore – Hawk

+0

Non, toutes les instructions SQL ne sont pas possibles dans LINQ. Vous devez vous rappeler que LINQ lui-même ne s'applique pas seulement à SQL. Il peut également être utilisé pour XML par exemple. Il y a beaucoup de concepts qui ne se chevauchent pas entre les requêtes SQL et XML, et LINQ doit rester suffisamment générique pour s'appliquer aux deux. – Ocelot20

+0

Merci. C'est très bon à savoir. J'ai l'impression que LINQ peut tout faire et plus, mais maintenant je sais. – Hawk

0

Pas exactement ce que vous essayez de acheive mais peut-être tout aussi rapide:

var query = 
    from u in db.UseLogs 
    where u.DocId == docId && u.LogDate >= fromDate && u.LogDate <= to 
    group u by u.UserID into g 
    select new 
    { 
     Visits = g.Count() 
    }; 

    int numberOfUsers = query.Count(); 
    int numberOfVisits = query.Sum(q=>q.Visits); 

Il exécute SQL qu'une seule fois et ce que le sommateur en mémoire.

+0

Salut. Merci de répondre! Je l'ai essayé et sur mon ordinateur actuel, il nécessite la même quantité de temps que les deux requêtes, donc c'est à la préférence de la lisibilité maintenant, je suppose. À moins que l'une des façons est la façon préférée de le faire. – Hawk