2

これを単純化して高速化する方法はありますか? 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 に変換できるわけではありません。

助けてくれてありがとう!

4

2 に答える 2

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

2 つのクエリを実行するよりも実際に高速かどうか、またはパフォーマンスの向上が読みやすさの損失に見合うかどうかを確認する必要があります。

于 2012-11-14T13:57:09.573 に答える
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 を 1 回だけ実行し、メモリ内で SUMming を実行します。

于 2012-11-14T14:36:24.417 に答える