【问题标题】:C# LINQ SPROC Getting Results FROM page numberC# LINQ SPROC 从页码获取结果
【发布时间】:2012-12-05 17:49:46
【问题描述】:

我在 ASP.NET MVC 应用程序中使用 LINQ TO SQL,我的代码看起来像这样

ISingleResult<proc_get_dataResult> sproc_result = db.proc_get_data();
return sproc_result .AsEnumerable().Cast<proc_get_dataResult>().ToList();

我上面的代码将整个结果集作为一个列表返回。但是,有问题的查询可能会返回大量数据,因此我想限制正在创建的对象的数量。因此,我现在将页码传递给此方法,例如,如果我传入第 2 页,如果每页常量设置为 25,我只想返回条目 26-50。

有没有办法做到这一点?

提前致谢

【问题讨论】:

    标签: c# linq asp.net-mvc-2


    【解决方案1】:

    嗯,它的效率值得怀疑,但它似乎是您查询并带回所有结果的要求的一部分。从那里你可以使用 LINQ 中的 Skip() 和 Take() 扩展方法来获得你想要的:

     return sproc_result.AsEnumerable().Cast<proc_get_dataResult>().ToList().OrderBy(r=>r.WhateverField).Skip(25).Take(25);
    

    编辑:我忘了你必须先订购才能跳过或接受。只需替换任何有序字段即可。

    【讨论】:

    • 不错。 LINQ 为此生成的 SQL 是什么?
    • 生成的 SQL 是您订购的字段上的 RowNumber,当您执行 .Skip(Y).Take(X); 时,它会采用 RowNumber 大于 Y 的顶部 X;
    【解决方案2】:

    See this thread.

    这不是一个 exact 重复,因为您是在 LINQ 的上下文中询问的。您需要修改存储过程以使用该线程中的一种分页方法。 CTE / Row_Number() over... 方法是一种非常有效的方法,可以将索引分配给结果集,然后可用于对结果进行排序/分页。

    【讨论】:

    • 有没有办法在 LINQ 中做到这一点?对于这种情况,我不想限制从该过程返回的数据。
    • @user327999 据我所知,但这无疑是有限的 LINQ。您的示例表明您正在调用存储过程。修改您的存储过程以使用引用的方法之一。
    • ScottGu 有一篇关于使用 SPROC 扩展 LINQ 的精彩文章:weblogs.asp.net/scottgu/archive/2007/08/16/…
    • @user327999 你说你不想限制返回的数据,但你也不想返回整个结果集。是哪个?
    • 我想从该过程中获取所有数据,因为该过程在我的应用程序中的许多不同位置使用。有些需要所有数据,有些只需要分页数据。存储过程非常有效,但是在尝试将大型结果集转换为数据对象时会出现性能问题。这就是我只想将数据限制在中间层内的主要原因
    猜你喜欢
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    相关资源
    最近更新 更多