一点一点地装入桌子

时间:2014-07-24 13:41:31

标签: c# linq

为了不通过在整个表中添加内存来耗尽内存,我正在进行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();
    }

1 个答案:

答案 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;
    }
}