3

Subsonic 2.2 ActiveRecord から 3.0.0.3 にアップデートしました。LINQ を使用して、次のようなページ検索クエリを実行しようとしています (私のオブジェクト/テーブルは「リポジトリ」と呼ばれます)。

Repository.Find(item => item.DocumentTitle.Contains(searchTerm))
    .OrderBy(i => i.DocumentTitle).Skip((currentPage - 1) * itemsPerPage)
    .Take(itemsPerPage);

SQL Server プロファイラーを使用してこのクエリによって生成された SQL を表示すると、SQL にページングは​​なく、すべてのページングは​​ C# のメモリ内で行われています。現在、Subsonic クエリ言語には適切に機能する優れた GetPaged プロシージャがありますが、LINQ もこれを行う必要があると思いました。ここで何かを見逃したことがありますか、それとも LINQ の制限ですか?

私はRepository.GetPaged()関数を認識していますが、十分なパラメーターがありません.動的ソートとFind().

4

3 に答える 3

5

さらにテストを行うと、このステートメントは正しく機能します。

(from i in dataContext.Repositories 
 where i.DocumentTitle.Contains(searchTerm) 
 orderby i.DateCreated ascending select i)
 .Skip((currentPage - 1) * itemsPerPage).Take(itemsPerPage);

実行すると、上記の linq ステートメントは、SQL で適切にページ化されて返されます。

私が到達できる唯一の結論は、メソッドチェーン構文を使用している場合、最初のラムダ式の外にいると

Repository.Find(item => item.DocumentTitle.Contains(searchTerm))

サブソニック SQL インタープリターは、最後にチェーンされたメソッドの SQL の作成を停止します。

.OrderBy(i => i.DocumentTitle).Skip(15).Take(10);

それとも、私はここで何か間違ったことをしているだけですか? 誰か洞察力がありますか?

于 2009-09-03T18:07:21.643 に答える
1

並べ替えフィールドに「des」を追加すると GetPaged を並べ替えることができますが...

ページングが機能するはずです。目の前のページング SQL を見ていますが、メモリ内で実行されていません。これをどのようにテストしていますか?クエリを実行する「ToList()」を使用する場合は、プロファイラーを見てください。

于 2009-09-01T00:24:32.593 に答える
0

少し遅いですが...

Repository.Find()

クエリが実行されるように IList を返すため、ページングなしで SQL が実行されます。

.Skip(x).Take(x)

メモリ内で行われます。試す

Repository.All().Where(expression).Skip(x).Take(x)

これらはすべて IQueryable を返し、どれもオブジェクトを列挙しないため、ページングは​​ ROW_NUMBER() 関数を使用して SQL で行われます。

Subsonic 3 のシンプルなリポジトリが次の SQL を生成していると言った

exec sp_executesql N'SELECT [t0].[Id], [t0].[IsDeleted], [t0].[Name], [t0].[ParentUuid], [t0].[Uuid]
FROM ( SELECT [t1].[Id], [t1].[IsDeleted], [t1].[Name], [t1].[ParentUuid], ROW_NUMBER() OVER() AS rownum, [t1].[Uuid]
FROM [Sites] AS t1
WHERE (([t1].[ParentUuid] = @p0) AND ([t1].[IsDeleted] = 0))) AS t0
WHERE [t0].[rownum] BETWEEN (20 + 1) AND (20 + 10)',N'@p0 uniqueidentifier',@p0='00000000-0000-0000-0000-000000000000'

例外をスローする

Unhandled Exception: System.Data.SqlClient.SqlException: The ranking function "ROW_NUMBER" must have an ORDER BY clause.

サブソニックにバグがあるようです:-(

于 2010-10-07T11:42:19.647 に答える