【发布时间】:2020-05-12 16:34:11
【问题描述】:
我有几种类型的对象,它们是从数据库中获取的,具有不同的模型,它们具有共同的 date 属性。我想对所有这些模型进行排序,但最后只按页面提取数据。问题是当我在动态列表中添加所有 IQuerable 模型时,它们会从数据库中提取所有数据,如果有数百条记录的话需要很长时间。
我已经做了什么:
- 创建了基础接口并在从他那里继承的模型中。
- 在动态列表中添加了所有模型。
- 按公共属性排序此列表。
- 添加了带有 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;
}
【问题讨论】:
-
一个常见的初学者错误是检索很多,然后在程序中进行过滤。不要那样做。在 DB Query 本身期间进行尽可能多的过滤、处理,尤其是分页。您的 C# 代码永远无法超越数据库的性能,而且充其量只会增加大量浪费的网络时间。 |我不太确定如何使用 linq-to-entities 来做到这一点(或者它是否可以工作)。但是根据 DBMS,您可以添加一个视图,将所有这些值计算出来并组合起来。
-
@Christopher 他正在使用
IQueryable这将使过滤分页发生在数据库中
标签: c# linq linq-to-entities