通过分页通过公共属性订购对象的动态列表

问题描述 投票:0回答:1

我有几种类型的对象,它们是我从数据库中获得的,具有不同的具有共同[属性的模型。我想对所有这些模型进行排序,但只能在页面末尾拉出数据。问题是当我在动态列表中添加所有IQuerable模型时,它们会从数据库中拉出所有数据,如果有数百条记录,它将需要一个很长时间。

我已经完成的工作:

    创建了基本接口,并继承了他的模型。
  1. 在动态列表中添加了所有模型。
  2. 按公用属性排序此列表。
  3. 使用X.PagedList添加的页面
  • 示例代码:

    型号:

    private interface BaseInfo { public DateTime Date { get; set; } } public class CompanyEvent : BaseInfo { public string Description { get; set; } public DateTime Date { get; set; } } public class SummerEvent : BaseInfo { public bool IsActive { get; set; } public DateTime Date { get; set; } public string MainPartner { get; set; } } public class Birthday : BaseInfo { public string FirstName { get; set; } public string LastName { get; set; } public int Age { get; set; } public DateTime Date { get; set; } }

    代码

    public IPagedList<dynamic> GetDynamicInfo(int pageNumber) { int pageSize = 10; List<dynamic> dynamicList = new List<dynamic>(); IQueryable<CompanyEvent> companyEvents = Employees.Select(a => new CompanyEvent() { Date = a.EventDate, Description = a.Description }); IQueryable<SummerEvent> summerEvents = Employees.Select(a => new SummerEvent() { Date = a.StartEventDate, IsActive = a.IsActive, MainPartner = a.Partner.Name }); IQueryable<Birthday> birthdays = Employees.Select(a => new Birthday() { Date = a.DateBorn, FirstName = a.FirstName, a.LastName = a.LastName }); dynamicList.AddRange(companyEvents); dynamicList.AddRange(summerEvents); dynamicList.AddRange(birthdays); var sortedDynamicList = dynamicList.OrderBy(a => ((BaseInfo)a).Date).ToPagedList(pageNumber, pageSize); return sortedDynamicList; }

  • c# linq linq-to-entities
    1个回答
    2
    投票
    当您使用ToPageList时,会将所有数据存储在内存中。您可以使用SkipTake将其转换为相应的sql并在DB端进行分页,例如:

    var sortedDynamicList = dynamicList .OrderBy(a => ((BaseInfo)a).Date) .Skip(pageNumber) .Take(pageSize) .ToPagedList(pageNumber, pageSize);

    第二次使用IPagedList<dynamic>,而不是使用IPagedList<BaseInfo>,它也将以相同的方式工作。

    更新:

    由于在这种情况下,数据是从不同的表甚至其中的不同列中加载的,一种可能的方法是分别在它们的每个页面中加载它们,然后对诸如此类的页面进行排序和分页:

    IQueryable<CompanyEvent> companyEvents = Employees.Skip(pageNumber).Take(pageSize) .Select(a => new CompanyEvent() { Date = a.EventDate, Description = a.Description }); IQueryable<SummerEvent> summerEvents = Employees.Skip(pageNumber).Take(pageSize) .Select(a => new SummerEvent() { Date = a.StartEventDate, IsActive = a.IsActive, MainPartner = a.Partner.Name }); IQueryable<Birthday> birthdays = Employees.Skip(pageNumber).Take(pageSize) .Select(a => new Birthday() { Date = a.DateBorn, FirstName = a.FirstName, a.LastName = a.LastName });

    然后执行以下操作:

    dynamicList.AddRange(companyEvents); dynamicList.AddRange(summerEvents); dynamicList.AddRange(birthdays); var sortedDynamicList = dynamicList.OrderBy(a => ((BaseInfo)a).Date) .ToPagedList(pageNumber, pageSize);

    © www.soinside.com 2019 - 2024. All rights reserved.