C# 没有网格的MVC3分页和排序?

C# 没有网格的MVC3分页和排序?,c#,.net,asp.net-mvc-3,C#,.net,Asp.net Mvc 3,我想知道是否可以使用@foreach Razor语法而不是使用特定的网格控件来实现数据分页和排序 是否难以实施?我是否应该坚持使用现有的网格解决方案,例如WebGrid或MVCContrib网格?如果使用LINQ,则可以使用OrderBy和ThenBy方法进行排序和Skip和Take方法进行分页。如果您在存储库中或控制器上对IQueryable执行此操作,您可以确保只提取所需的数据,而不是全部提取然后进行排序。如果您使用LINQ,则可以使用OrderBy和ThenBy方法进行排序和Skip和Ta

我想知道是否可以使用@foreach Razor语法而不是使用特定的网格控件来实现数据分页和排序


是否难以实施?我是否应该坚持使用现有的网格解决方案,例如WebGrid或MVCContrib网格?

如果使用
LINQ
,则可以使用
OrderBy
ThenBy
方法进行排序和
Skip
Take
方法进行分页。如果您在存储库中或
控制器
上对
IQueryable
执行此操作,您可以确保只提取所需的数据,而不是全部提取然后进行排序。

如果您使用
LINQ
,则可以使用
OrderBy
ThenBy
方法进行排序和
Skip
Take
用于分页的方法。如果您在存储库中或在
IQueryable
上的
Controller
中执行此操作,则可以确保只提取所需的数据,而不是提取所有数据然后进行排序。

我在列表中为pagin编写了一个扩展方法:

public static class DataPager
    {
        public static IEnumerable<T> PageData<T>(this IEnumerable<T> source, int currentPage, int pageSize)
        {
            var sourceCopy = source.ToList();

            if (sourceCopy.Count() < pageSize)
            {
                return sourceCopy;
            }

            return sourceCopy.Skip((currentPage - 1) * pageSize).Take(pageSize);
        }
    }
公共静态类数据寻呼机
{
公共静态IEnumerable PageData(此IEnumerable源、int currentPage、int pageSize)
{
var sourceCopy=source.ToList();
if(sourceCopy.Count()
可能对你有用

    var courses = List<Courses>(); // Get courses somehow...

    int currentPage = 2;
    int pageSize = 5;

var pagedCourses = courses.OrderBy(c => c.Course.Title).PageData(currentPage, pageSize);
var courses=List();//以某种方式获得课程。。。
int currentPage=2;
int pageSize=5;
var pagedCourses=courses.OrderBy(c=>c.Course.Title).PageData(currentPage,pageSize);

我在列表中为pagin编写了一个扩展方法:

public static class DataPager
    {
        public static IEnumerable<T> PageData<T>(this IEnumerable<T> source, int currentPage, int pageSize)
        {
            var sourceCopy = source.ToList();

            if (sourceCopy.Count() < pageSize)
            {
                return sourceCopy;
            }

            return sourceCopy.Skip((currentPage - 1) * pageSize).Take(pageSize);
        }
    }
公共静态类数据寻呼机
{
公共静态IEnumerable PageData(此IEnumerable源、int currentPage、int pageSize)
{
var sourceCopy=source.ToList();
if(sourceCopy.Count()
可能对你有用

    var courses = List<Courses>(); // Get courses somehow...

    int currentPage = 2;
    int pageSize = 5;

var pagedCourses = courses.OrderBy(c => c.Course.Title).PageData(currentPage, pageSize);
var courses=List();//以某种方式获得课程。。。
int currentPage=2;
int pageSize=5;
var pagedCourses=courses.OrderBy(c=>c.Course.Title).PageData(currentPage,pageSize);

Jason回答的重要提示

您不应该使用ToList方法,因为它会对内存消耗和总体性能产生负面影响


您还应该检查IEnumerable对象是否确实是IQueryable,并在使用扩展方法Skip和Take之前将其转换为后一种类型。这将确保查询提供程序将负责生成适当的sql以从数据库中进行选择,而不是迭代所有记录。

Jason回答的重要注意事项

您不应该使用ToList方法,因为它会对内存消耗和总体性能产生负面影响


您还应该检查IEnumerable对象是否确实是IQueryable,并在使用扩展方法Skip和Take之前将其转换为后一种类型。这将确保查询提供程序将负责生成适当的sql以从数据库中进行选择,而不是迭代所有记录。

我认为OP并不是在要求服务器端代码。 您可以使用它进行排序。
至于分页,我建议在URL上附加页码,并限制服务器端的数据。

我不认为OP要求服务器端代码。 您可以使用它进行排序。 至于分页,我建议在URL上附加页码,并限制服务器端的数据