Asp.net IQueryable针对带联接的SQL 2000分页
我有一个包含大约10个连接的查询。使用列表视图和Linq数据源,它可以针对SQL2008进行分页,但在针对SQL2000运行时无法生成正确的结果。没有抛出异常,但结果显然是无序的,有时返回相同的页面。在阅读LINQ文档时,SQL2000不支持针对带有连接的查询进行分页。说得够多了,尽管我本以为会有例外 我现在无法将数据移出SQL2000。解决方案是执行完整查询,然后执行基于内存的分页Asp.net IQueryable针对带联接的SQL 2000分页,asp.net,linq,Asp.net,Linq,我有一个包含大约10个连接的查询。使用列表视图和Linq数据源,它可以针对SQL2008进行分页,但在针对SQL2000运行时无法生成正确的结果。没有抛出异常,但结果显然是无序的,有时返回相同的页面。在阅读LINQ文档时,SQL2000不支持针对带有连接的查询进行分页。说得够多了,尽管我本以为会有例外 我现在无法将数据移出SQL2000。解决方案是执行完整查询,然后执行基于内存的分页 protected void LinqDataSourceMain_Selecting(object sende
protected void LinqDataSourceMain_Selecting(object sender,
LinqDataSourceSelectEventArgs e)
{
// var query = myquery with join...
e.Result = query.ToList();
}
现在的问题是:调用ToList()或ToArray()是否更有效
AsEnumerable()无法解决此问题。查看带有Reflector的扩展方法,它只返回“source”,所以这对我来说很有意义
e.Result = query.AsEnumerable();
public static IEnumerable<TSource> AsEnumerable<TSource>(
this IEnumerable<TSource> source)
{
return source;
}
e.Result=query.AsEnumerable();
公共静态IEnumerable AsEnumerable(
这是(不可数的来源)
{
返回源;
}
但是,以下操作是否比ToList()或ToArray()更有效?它确实起作用,而且确实推迟了执行
e.Result = query.ToEnumerable();
public static IEnumerable<TSource> ToEnumerable<TSource>(
this IEnumerable<TSource> source)
{
foreach (var item in source)
yield return item;
}
e.Result=query.ToEnumerable();
公共静态IEnumerable到numerable(
这是(不可数的来源)
{
foreach(源中的var项)
收益回报项目;
}
ToList()
将比ToArray()
更高效,因为它不需要从超大缓冲区到固定大小的阵列进行最终复制
如果要在内存中进行分页,则不需要延迟执行(IMO),因为需要获得项目的计数和随机访问。您不希望每次都必须重新执行查询。ToList()
将比ToArray()
更高效,因为它不需要从超大缓冲区到固定大小的数组进行最终复制
如果要在内存中进行分页,则不需要延迟执行(IMO),因为需要获得项目的计数和随机访问。您不必每次都重新执行查询。谢谢。我每次都需要重新查询,因为这是一个web应用程序,我真的不想将结果存储在临时位置,例如会话。还在犹豫推迟执行吗?我的眼睛会发毛吗?最后,我应该能够离开sql 2k,但现在不行。出于兴趣,您将如何计算要显示的页面数?结果无序这一事实表明,无论你做什么都会有问题——除非你能让排序顺序保持一致,否则你不可能明智地分页,除非我遗漏了什么。当我返回列表时,分页和排序工作正常。返回IQueryable时失败。有了IQ,第一页显示正确,但随后事情就从那里消失了。看看SQL分析器,SQL真的很糟糕。子查询覆盖子查询覆盖子查询覆盖联接等。针对SQL 2008生成的SQL非常干净。猜测通过延迟LDS_Selecting事件中的执行,不会延迟很长时间。即使使用分页和延迟执行,完整查询仍然针对SQL运行。只是想知道是否最好暂时改变一下这个事件?乔恩,不同的答案。query.ToList()的sql跟踪相同;或query.ToEnumerable();ToEnumerable()是否更有效,因为它不会像list比ToArray更有效那样分配列表?忽略延迟执行部分。谢谢。我每次都需要重新查询,因为这是一个web应用程序,我真的不想将结果存储在临时位置,例如会话。还在犹豫推迟执行吗?我的眼睛会发毛吗?最后,我应该能够离开sql 2k,但现在不行。出于兴趣,您将如何计算要显示的页面数?结果无序这一事实表明,无论你做什么都会有问题——除非你能让排序顺序保持一致,否则你不可能明智地分页,除非我遗漏了什么。当我返回列表时,分页和排序工作正常。返回IQueryable时失败。有了IQ,第一页显示正确,但随后事情就从那里消失了。看看SQL分析器,SQL真的很糟糕。子查询覆盖子查询覆盖子查询覆盖联接等。针对SQL 2008生成的SQL非常干净。猜测通过延迟LDS_Selecting事件中的执行,不会延迟很长时间。即使使用分页和延迟执行,完整查询仍然针对SQL运行。只是想知道是否最好暂时改变一下这个事件?乔恩,不同的答案。query.ToList()的sql跟踪相同;或query.ToEnumerable();ToEnumerable()是否更有效,因为它不会像list比ToArray更有效那样分配列表?忽略延迟执行部分。