Linq to SQL with UDF - 分页异常

时间:2012-06-30 17:59:55

标签: .net linq linq-to-sql

美好的一天。我在 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();

我得到了异常:“此提供程序仅支持跳过有序查询返回包含所有标识列的实体或投影,其中查询是单表(非连接)查询,或者是Distinct,Except,Intersect ,或联盟(不是康卡特)的行动。“

带UDF的LinqToSQL是否支持分页? 如果它做了那么我做错了什么?

2 个答案:

答案 0 :(得分:0)

问题在于:“查询是单表(非加入)查询”。

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

顺便说一下,这个UDF仅用于示例目的吗?看起来它可以在LINQ中以强类型的方式轻松表达,所以我不得不想知道为什么要使用UDF?

答案 1 :(得分:0)

我发现了问题 - 我使用的库中的DataContext有

[Provider(typeof(Sql2000Provider))]

因此在没有“Distinct”的情况下查询将无法工作,因为在sql 2000中没有Row_number运算符,并且生成分页查询的唯一方法是使用不同的技巧。 在这种情况下,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)
    { }
}

P.S。

  

问题在于:“查询是单表(非连接)查询的位置”。

MSSQL中的表结果函数像单个查询一样处理,因此在分页查询中使用它们是正确的。