2009-04-08 54 views
0

我有一个包含约10个连接的查询。使用列表视图和Linq数据源可以很好地对SQL2008进行页面处理,但在针对SQL2000运行时无法产生正确的结果。没有发生异常,但结果显然不符合规定,有时会返回相同的页面。通过LINQ Docs阅读,在SQL2000上不支持对连接查询进行分页。够了,虽然我会预料到一个例外。IQueryable针对SQL 2000与连接寻呼

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

protected void LinqDataSourceMain_Selecting(object sender, 
    LinqDataSourceSelectEventArgs e) 
{ 
    // var query = myquery with join... 
    e.Result = query.ToList(); 
} 

现在的问题是:调用ToList()或ToArray()更有效吗?

AsEnumerable()不能解决问题。用Reflector看扩展方法,它只是返回'源',所以这对我来说很有意义。

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; 
} 

回答

3

ToList()会比ToArray()更有效,因为它并不需要从一个超大缓存做最后的拷贝到一个固定大小的数组。

如果你打算做内存分页,你不需要延期执行(IMO),因为你需要获得物品的计数和随机存取。您不希望每次都必须重新执行查询。

+0

谢谢。我需要每次重新查询,因为这是一个Web应用程序,我真的不想将结果存储在临时位置,如Session。仍然在延期执行的围栏上? Mybe劈头发?最后,我应该能够脱离sql 2k,但现在不行。 – andleer 2009-04-08 17:06:53

+0

您打算如何计算出要显示的页面数量?结果不合理的事实表明,无论你做什么,都会遇到问题 - 除非可以使排序顺序保持一致,否则除非我错过了某些内容,否则无法合理地进行页面切换。 – 2009-04-08 17:09:43

+0

当我返回一个列表时,分页和排序工作正常。当我返回一个IQueryable时它失败。使用智商,第一页显示正确,但事情从那里开始适用。看一下SQL分析器,SQL实际上是令人讨厌的。子查询通过连接上的子查询等。 – andleer 2009-04-08 17:20:20