我有一个包含大约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;
}
答案 0 :(得分:3)
ToList()
将比ToArray()
更有效,因为它不需要从超大缓冲区到固定大小的数组进行最终复制。
如果您要进行内存中分页,则不需要想要延迟执行(IMO),因为您需要获取项目数和随机访问权。您不希望每次都重新执行查询。