Linq to SQL组合的聚合函数

时间:2012-11-14 12:58:24

标签: sql linq count distinct

有没有办法简化这个并让它变得更快? 在SQL中,我在同一查询中使用count(*)和count(distinct),这给了我更快的结果

非常感谢。

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();

结论

LINQ中没有Count(Distinct)。不是每个SQL语句都可以转换为LINQ。

感谢帮助人员!

2 个答案:

答案 0 :(得分:0)

这是你要找的吗?

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()
}

您需要检查它是否实际上比运行两个查询更快,或者性能增益值得失去可读性。

答案 1 :(得分:0)

不完全是你想要达到的目标但可能同样快:

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);

它只执行一次SQL并在内存中执行SUM。