Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net IQueryable针对带联接的SQL 2000分页_Asp.net_Linq - Fatal编程技术网

Asp.net IQueryable针对带联接的SQL 2000分页

Asp.net IQueryable针对带联接的SQL 2000分页,asp.net,linq,Asp.net,Linq,我有一个包含大约10个连接的查询。使用列表视图和Linq数据源,它可以针对SQL2008进行分页,但在针对SQL2000运行时无法生成正确的结果。没有抛出异常,但结果显然是无序的,有时返回相同的页面。在阅读LINQ文档时,SQL2000不支持针对带有连接的查询进行分页。说得够多了,尽管我本以为会有例外 我现在无法将数据移出SQL2000。解决方案是执行完整查询,然后执行基于内存的分页 protected void LinqDataSourceMain_Selecting(object sende

我有一个包含大约10个连接的查询。使用列表视图和Linq数据源,它可以针对SQL2008进行分页,但在针对SQL2000运行时无法生成正确的结果。没有抛出异常,但结果显然是无序的,有时返回相同的页面。在阅读LINQ文档时,SQL2000不支持针对带有连接的查询进行分页。说得够多了,尽管我本以为会有例外

我现在无法将数据移出SQL2000。解决方案是执行完整查询,然后执行基于内存的分页

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更有效那样分配列表?忽略延迟执行部分。