0

良い一日。MS SQL 2008R2ベースでテーブル結果UDFを取得し、マップされたクラス「ApplicationGroupsResult」を取得しました。

ALTER FUNCTION [dbo].[netsqlazman_ApplicationGroups] ()
RETURNS TABLE
AS RETURN
SELECT     dbo.[netsqlazman_ApplicationGroupsTable].*
FROM         dbo.[netsqlazman_ApplicationGroupsTable] INNER JOIN
                      dbo.[netsqlazman_Applications]() Applications ON dbo.[netsqlazman_ApplicationGroupsTable].ApplicationId = Applications.ApplicationId



[Function(Name="dbo.netsqlazman_ApplicationGroups", IsComposable=true)]
public IQueryable<ApplicationGroupsResult> ApplicationGroups()
{
return base.CreateMethodCallQuery<ApplicationGroupsResult>(this, (MethodInfo) MethodBase.GetCurrentMethod(), new object[0]);
}

今、私はいくつかの記録を取りたいです:

            var query = context.ApplicationGroups();

            totalRecordsCount = query.Count();

            query = string.IsNullOrWhiteSpace(sortBy)
                        ? query.OrderBy(x => x.ApplicationGroupId)
                        : query.OrderBy(sortBy);

            return query
                .Skip(pageNumber*queryRecordsCount)
                .Take(queryRecordsCount)
                .ToArray();

そして、例外が発生しました。「このプロバイダーは、すべてのID列を含むエンティティまたはプロジェクションを返す順序付けされたクエリのみをスキップします。クエリは単一テーブル(非結合)クエリであるか、Distinct、Except、Intersect、またはUnionです。 (Concatではない)操作。」

UDFを使用したLinqToSQLはページングをサポートしていますか?もしそうなら、私は何を間違えますか?

4

2 に答える 2

0

問題は次のとおりです。「クエリが単一テーブル(非結合)クエリである場合」。

UDFのクエリは、Inner Join別のテーブルに対して実行します。動作するためSkipには、かなり「安定した」結果セットが必要であり、そのチャンクを正確に選択でき、毎回ランダムなデータを取得しないようにする必要があります。

ちなみに、このUDFは単なる例ですか?LINQで強く型付けされた方法で簡単に表現できるように見えるので、なぜこれにUDFを使用させたいのか疑問に思います。

于 2012-07-01T13:39:12.397 に答える
0

私は問題を見つけました-私が使用したライブラリのDataContextには

[Provider(typeof(Sql2000Provider))]

SQL 2000にはRow_number演算子がなく、ページングクエリを生成する唯一の方法は、distinctでトリックを使用することであるため、このクエリは「Distinct」なしでは機能しません。その場合のLINQクエリはどうあるべきか。

return query
            .Distinct()
            .Skip(pageNumber*queryRecordsCount)
            .Take(queryRecordsCount)
            .ToArray();

独自のDataContextを作成したところ、問題は解決しました。

[Provider(typeof(Sql2008Provider))]
public sealed class AzManDataContext : NetSqlAzManStorageDataContext
{
    public AzManDataContext(IDbConnection connection) : base(connection)
    { }
}

PS

問題は次のとおりです。「クエリが単一テーブル(非結合)クエリである場合」。

MSSQLのテーブル結果関数は単一のクエリのように処理されるため、ページングクエリで使用するのが適切です。

于 2012-07-02T04:45:23.773 に答える