0

再会。我在我的MS SQL 2008R2基础和一些映射类“ApplicationGroupsResult”中得到了一些表结果 UDF

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

我遇到了异常:“此提供程序仅支持跳过返回实体或包含所有标识列的投影的有序查询,其中查询是单表(非连接)查询,或者是 Distinct、Except、Intersect 或 Union (不是 Concat)操作。”

带有 UDF 的 LinqToSQL 是否支持分页?如果确实如此,那么我做错了什么?

4

2 回答 2

0

I found the problem - DataContext in library that I used had

[Provider(typeof(Sql2000Provider))]

So that query would not work without "Distinct" because in sql 2000 there is no Row_number operator and the only way to generate paging query is to use the trick with distinct. How LINQ query should be in that case.

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

I just created my own DataContext and the problem solved:

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

P.S.

Here's the problem: "where the query is a single-table (non-join) query".

Table result function in MSSQL handled like a single query so it's correct to use them in paging queries.

于 2012-07-02T04:45:23.773 回答
0

这是问题所在:“查询是单表(非连接)查询”。

UDF 中的查询Inner Join对另一个表执行。为了Skip工作,必须有一个相当“稳定”的结果集,以确保它可以准确地选择它的块,而不是每次都拉一些随机数据。

顺便说一句,这个 UDF 是否只是为了示例目的?它看起来可以很容易地在 LINQ 中以强类型的方式表达,所以我想知道你为什么希望它使用 UDF?

于 2012-07-01T13:39:12.397 回答