以块的形式一点一点地加载Table
本文关键字:一点 加载 Table | 更新日期: 2023-09-27 18:14:30
为了不耗尽内存,我在其中做了LOAD_SIZE
记录块。我是这样做的,我觉得有些索引偏离了一条记录?以及我可以做的性能改进所以我想听听你对这个方法的意见。
int totalCount = repo.Context.Employees.Count();
int startRow = 0;
while (startRow <= totalCount)
{
repo.PaginateEmployees(startRow, LOAD_SIZE);
startRow = startRow + LOAD_SIZE ;
}
public List<EmpsSummary> PaginateEmployees(int startRow, int loadSize)
{
var query = (from p in this.Context.Employees
.Skip(startRow).Take(loadSize)
select new EmpsSummary
{
FirstName = p.FirstName,
LastName = p.LastName,
Phone = p.Phone
});
return query.ToList();
}
由于Linq的工作方式(延迟加载和比较),如果您正确地制定语句,它将比您能够更好地管理内存。
根据您的评论(应该添加到问题中),我提供了这个解决方案,它应该可以很好地为您管理内存。
这个示例代码不是用来编译的——它是作为一个示例
// insert list
List<EmpsSummary> insertList;
// add stuff to insertList
List<EmpsSummary> filteredList = insertList.Except(this.Context.Employees);
假设this.Context.Employees
的类型为EmpsSummary。如果不是,则必须将其强制转换为正确的类型。
您还需要能够比较EmpsSummary。要这样做,创建这个公平,像这样:
这个示例代码不是用来编译的——它是作为一个示例
public class EmpsSummary : IEquatable<EmpsSummary>
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Phone { get; set; }
public bool Equals(EmpsSummary other)
{
//Check whether the compared object is null.
if (Object.ReferenceEquals(other, null)) return false;
//Check whether the compared object references the same data.
if (Object.ReferenceEquals(this, other)) return true;
//Check whether the products' properties are equal.
return FirstName.Equals(other.FirstName) &&
LastName.Equals(other.LastName) &&
Phone.Equals(other.Phone);
}
// If Equals() returns true for a pair of objects
// then GetHashCode() must return the same value for these objects.
public override int GetHashCode()
{
int hashProductFirstName = FirstName == null ? 0 : FirstName.GetHashCode();
int hashProductLastName = LastName == null ? 0 : LastName.GetHashCode();
int hashProductPhone = Phone == null ? 0 : Phone.GetHashCode();
//Calculate the hash code
return hashProductFirstName ^ hashProductLastName ^ hashProductPhone;
}
}