可以通过联接对SQL 2000分页进行智能化

时间:2009-04-08 16:32:42

标签: asp.net linq

我有一个包含大约10个连接的查询。使用列表视图和Linq数据源,它可以很好地对抗SQL2008,但在针对SQL2000运行时无法生成正确的结果。没有抛出异常,但结果显然是乱序的,有时会返回相同的页面。阅读LINQ Docs,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;
}

但是,以下是否比ToList()或ToArray()更有效?它确实有效,它确实推迟了执行。

e.Result = query.ToEnumerable();

public static IEnumerable<TSource> ToEnumerable<TSource>(
    this IEnumerable<TSource> source)
{
    foreach (var item in source)
        yield return item;
}

1 个答案:

答案 0 :(得分:3)

ToList()将比ToArray()更有效,因为它不需要从超大缓冲区到固定大小的数组进行最终复制。

如果您要进行内存中分页,则不需要想要延迟执行(IMO),因为您需要获取项目数和随机访问权。您不希望每次都重新执行查询。