我有几种类型的对象,它们是我从数据库中获得的,具有不同的具有共同[
型号:
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; }
ToPageList
时,会将所有数据存储在内存中。您可以使用Skip
和Take
将其转换为相应的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);