1

この LINQ 関数を正しい T-SQL 関数で生成しようとして苦労しています。

次の文を確認してください。

// determine the max count of exams applied by students
IQueryable query = (from at in Database.Current.AnsweredTests
                    where at.TestId == id
                    group at by at.StudentId into s
                    select s.Count()).Max();

ご覧のとおり、この関数は構文的に間違っています。なぜなら、Max拡張子は を返すからintです。私が達成しようとしているのは、正しい T-SQL を生成することです。

このようなもの:

MAX(SELECT x.COUNT()
FROM...
GROUP BY StudentId)

良いパフォーマンスが欲しいのでこれを行いましたが、それはパフォーマンスの低下です。MAXしたがって、私の問題は、 およびのような集約関数を使用して正しい LINQ 文をどのように記述できるかCOUNTです。

アップデート:

SELECT [GroupBy1].[A1] AS [C1]
FROM ( SELECT 
    [Extent1].[StudentId] AS [K1], 
    COUNT(1) AS [A1]
    FROM [dbo].[AnsweredTests] AS [Extent1]
    WHERE  CAST( [Extent1].[TestId] AS int) = @p__linq__0
    GROUP BY [Extent1].[StudentId]
)  AS [GroupBy1]

これが IQueryable を生成するものです (もちろん、最大拡張子を削除した場合)。サーバー側のパフォーマンスを向上させるために、その T-SQL クエリ内に集計関数 MAX を含める方法があるかどうかを知りたいです。

4

2 に答える 2

0

あなたがすることができてORDER BY DESCENDING、それから最初に取ることができます:

var Max = (from at in Database.Current.AnsweredTests
           where at.TestId == id
           group at by at.StudentId into s
           select new { Count = s.Count() }).OrderByDescending(o=>o.Count).First();
于 2013-01-20T07:33:01.480 に答える
0

次のようにクエリを表現することもできます。

SELECT TOP 1 COUNT(*)
FROM AnsweredTests
WHERE TestId = @id
GROUP BY StudentId
ORDER BY COUNT(*) DESC

そのロジックに従って、これは(テストされていない)あなたが探しているものでなければなりません:

var result = (from at in Database.Current.AnsweredTests
              where at.TestId == id
              group at by at.StudentId into s
              orderby s.Count() descending
              select s.Count()).First()
于 2013-01-20T06:58:45.460 に答える