Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用分页按公共属性对对象的动态列表排序_C#_Linq_Linq To Entities - Fatal编程技术网

C# 使用分页按公共属性对对象的动态列表排序

C# 使用分页按公共属性对对象的动态列表排序,c#,linq,linq-to-entities,C#,Linq,Linq To Entities,我有几种类型的对象,这些对象是我从数据库中获取的,它们有不同的模型,具有相同的日期属性。我想对所有这些模型进行排序,但只在最后逐页提取数据。问题是,当我在动态列表中添加所有iquirable模型时,它们会从数据库中提取所有数据,如果有数百条记录,则需要很长时间 我已经做了: 在继承自他的模型中创建基本接口和。 在动态列表中添加了所有模型。 按公共属性对此列表进行排序。 添加了带有X.PagedList的页面 示例代码: 型号: private interface BaseInfo

我有几种类型的对象,这些对象是我从数据库中获取的,它们有不同的模型,具有相同的日期属性。我想对所有这些模型进行排序,但只在最后逐页提取数据。问题是,当我在动态列表中添加所有iquirable模型时,它们会从数据库中提取所有数据,如果有数百条记录,则需要很长时间

我已经做了:

在继承自他的模型中创建基本接口和。 在动态列表中添加了所有模型。 按公共属性对此列表进行排序。 添加了带有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; }

        }
代码

当您使用ToPageList时,它会将所有数据存储在内存中。您可以使用Skip and Take,它将被转换为相应的sql,并在DB端进行分页,如:

var sortedDynamicList = dynamicList
                      .OrderBy(a => ((BaseInfo)a).Date)
                      .Skip(pageNumber)
                      .Take(pageSize)
                      .ToPagedList(pageNumber, pageSize);
第二,您可以使用同样工作方式的IPagedList,而不是使用IPagedList

更新: 在本场景中,数据从不同的表甚至不同的列中加载,一种可能的方法是在每一页中分别加载数据,然后对这些数据进行排序和分页,如:

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
        });
当您使用ToPageList时,它会将所有数据存储在内存中。您可以使用Skip and Take,它将被转换为相应的sql,并在DB端进行分页,如:

var sortedDynamicList = dynamicList
                      .OrderBy(a => ((BaseInfo)a).Date)
                      .Skip(pageNumber)
                      .Take(pageSize)
                      .ToPagedList(pageNumber, pageSize);
第二,您可以使用同样工作方式的IPagedList,而不是使用IPagedList

更新: 在本场景中,数据从不同的表甚至不同的列中加载,一种可能的方法是在每一页中分别加载数据,然后对这些数据进行排序和分页,如:

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
        });

这是一个初学者常见的错误,检索很多,然后在程序中进行过滤。不要那样做。在DB查询本身期间,执行尽可能多的过滤、处理,尤其是分页。你的C代码永远无法超过DB的性能,充其量只能增加大量浪费的网络时间我不太确定如何使用LINQtoEntities实现这一点,或者它是否可以工作。但是,根据DBMS的不同,您可以添加一个将所有这些值进行数学运算和组合的视图。@Christopher他正在使用IQueryable,这将使筛选分页在DBS中发生。初学者通常会犯一个错误,即大量检索,然后在程序中进行筛选。不要那样做。在DB查询本身期间,执行尽可能多的过滤、处理,尤其是分页。你的C代码永远无法超过DB的性能,充其量只能增加大量浪费的网络时间我不太确定如何使用LINQtoEntities实现这一点,或者它是否可以工作。但根据DBMS的不同,您可以添加一个将所有这些值进行匹配和组合的视图。@Christopher他正在使用IQueryable,当我将数据添加到动态列表时,它将在DBI中进行筛选分页:dynamicList.AddRangecompanyEvents;dynamicList.addRangeSumerEvents;dynamicList.AddRange生日;所有数据都已经进入内存,我想避免这种情况…@Librain是的,这将使它们进入内存,您不能这样做,您需要从三个表中分别查询分页数据,然后在内存中对它们进行排序,并选择所需数据,或者,您将需要编写sql查询或存储过程,因为您的场景与normal@Librain我已经用一种可能的方法更新了答案谢谢你的回复,但是会有几个问题。如果我从表中选取某一部分,则无法保证这些数据会有结果,因为我按日期排序,而且也无法计算所有页面数…@libarin您需要重新考虑您的方法,当前在向动态列表添加数据时会变得复杂:dynamicList.AddRangecompanyEvents;dynamicList.addRangeSumerEvents;dynamicList.AddRange生日;所有数据都已经进入内存,我想避免这种情况…@Librain是的,这将使它们进入内存,您不能这样做,您需要从三个表中分别查询分页数据,然后在内存中对它们进行排序,并选择所需数据,或者,您将需要编写sql查询或存储过程,因为您的场景与normal@Librain我已经用一种可能的方法更新了答案谢谢你的回复,但是会有几个问题。如果我从表中选取某个部分,则无法保证这些数据会有结果,因为我按日期排序,而且也无法计算所有页面数…@Librain您需要重新考虑您的方法,目前它已变得过于复杂