美好的一天。我在 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是否支持分页? 如果它做了那么我做错了什么?
答案 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中的表结果函数像单个查询一样处理,因此在分页查询中使用它们是正确的。