为了不通过在整个表中添加内存来耗尽内存,我正在进行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();
}
答案 0 :(得分:2)
由于Linq的工作原理(延迟加载和比较),如果你正确地表达你的陈述,它将比你能够更好地管理记忆。
从你的评论(应该添加到问题中)我提供这个解决方案,它应该为你管理内存。
此示例代码无意编译 - 它仅作为示例提供
// insert list
List<EmpsSummary> insertList;
// add stuff to insertList
List<EmpsSummary> filteredList = insertList.Except(this.Context.Employees);
这假设this.Context.Employees
的类型为EmpsSummary。如果不是,则必须将其强制转换为正确的类型。
此外,您还需要能够比较EmpsSummary。为此,请创建此IEquitable:
此示例代码无意编译 - 它仅作为示例提供
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;
}
}