【问题标题】:Pagination using LINQ and passing parameter for the search使用 LINQ 进行分页并传递参数进行搜索
【发布时间】:2020-03-19 00:29:37
【问题描述】:

该方法工作正常,它正在返回所有数据,但我将如何传递参数、姓名和年龄,以将这些数据带入分页搜索?

如果参数为null,则返回所有数据,如果不是,则返回参数的数据

public Pagination<User> GetPagination(string name, string age, int pageSize, int pageNumber)
{
   var users= this.DbContext.User

    var total = users.Select(x => x.Id).Distinct().ToList().Count;

    var listUsers = users
            .OrderByDescending(x => x.Name)
            .Skip(pageSize * (pageNumber - 1))
            .Take(pageSize)
            .ToList()


     var Pagedlist= new Pagination<User>()
        {
            List = listUsers,
            Count = total
        };

        return Pagedlist;
}

【问题讨论】:

  • 您在寻找.Where(predicate)吗?

标签: c# .net asp.net-mvc entity-framework


【解决方案1】:

正如 Jeremy 所说,您需要按此顺序执行查询,以便在数据库端运行您的 sql 查询,而不是将数据放入内存以执行分页。如果您有 100 万条记录,使用您的方法会遇到一些性能问题。

关于您需要应用于 IQueryable 的过滤器,您可以按照 Jeremy 建议的方式进行操作

var users = this.DbContext.User.Where(x => x.Age = age && x.Name = name)

或者你可以用这种方式构造你的谓词

private Expression<Func<User, bool>> GetMyPredicate(string name, int age)
{
        Expression<Func<Application, bool>> predicate = x => true;
        Expression<Func<Application, bool>> exp = null;

        predicate = x => x.Name == name;
        exp = x => x.Age = age;

        //Check the And predicate below
        predicate = exp != null ? predicate.And(exp) : predicate;

        return predicate
}

现在可以了

var predicate = GetMyPredicate(name, age);
var users = this.DbContext.User.Where(predicate);

如果您想知道 And 谓词的工作原理,请在此处查看完整代码 PredicateBuilder 并尝试将其包含在您的解决方案中。您可以获取更多关于Dynamically Composing Expression Predicates的详细信息

【讨论】:

  • 优雅的解决方案
【解决方案2】:

首先构建主过滤IQueryable&lt;User&gt;,将其用作Count查询的基础,然后是结果页面;

var users = this.DbContext.User
    .Where( ... );

var total = users.Count();

var listUsers = users
        .OrderByDescending(x => x.Name)
        .Skip(pageSize * (pageNumber - 1))
        .Take(pageSize)
        .ToList()

【讨论】:

    猜你喜欢
    • 2011-02-27
    • 2010-09-20
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    相关资源
    最近更新 更多