2013-10-25 50 views
1

我想让列表框中的项目绑定到内存中的linq实体结果集。实体记录的结构等:是否有可能在内存中重新排序linq IQueryable?

public class DisplayEntity 
{ 
    public int IDPK { get; set; } 
    public int OrderInt { get; set; } 
    public string Name { get; set; } 
} 

它们通过在一个形式负载方法和因子方法的整数列加载和排序方法:

IQueryable<DisplayEntity> entitylist = null; 
private void WindowForm_Load(object sender, EventArgs e) 
{ 
    entitylist = from e in dbcontext select e; 
    RefreshList(); 
} 
private void RefreshList() 
{ 
    entitylist = entitylist.OrderBy(e => e.OrderInt); //order by 
    dbcontext.Refresh(RefreshMode.KeepChanges, entitylist); 
    listBoxEntities.DataSource = entitylist; 
} 

第一次数据集被加载它正确排序,但随后的数据更改和RefreshList()调用不会重新排序该实体列表。

private void ChangeOrder(int argIDPK, int argNewPosition) 
{ 
    DisplayEntity tempe = (from e in entitylist where e.IDPK == argIDPK select e).First(); 
    tempe.OrderInt = argNewPosition; 
    RefreshList(); 
} 

我相信我的代码的问题是围绕排序依据不与内存LINQ结果或数据绑定工作,因为改变内存中的entitylist实体通过类似的一个名称使用ChangeOrder方法不显示RefreshList()调用后更改的名称。

+0

设置:第一个存储完全未排序的初始数据库结果(希望稍后有变化),第二个存储排序为数据绑定的初始数据库结果在第一个排序后没有正确排序到第二个集合中 – stackuser83

回答

2

您应该记住,entityList是一个查询 - 它不是一个简单的内存实体列表,每次您对它进行“排序”或搜索某个实体时,它都会在数据库上执行。同时Linq to Sql跟踪从数据库返回的对象。如果具有相同Id的实体存在于内存中,则会重新用于新的查询结果。

所以,这里是发生了什么:这里

private void WindowForm_Load(object sender, EventArgs e) 
{ 
    entitylist = dbcontext.Entities; // SELECT * FROM Entities 
    RefreshList(); 
} 

private void ChangeOrder(int argIDPK, int argNewPosition) 
{ 
    // SELECT TOP(1) * FROM Entities WHERE IDPK = @argIDPK 
    // query is executed here 
    DisplayEntity tempe = entitylist.First(e => e.IDPK == argIDPK); 
    tempe.OrderInt = argNewPosition; 
    RefreshList(); 
} 

private void RefreshList() 
{ 
    // SELECT * FROM Entities ORDER BY OrderInt 
    entitylist = entitylist.OrderBy(e => e.OrderInt); 
    dbcontext.Refresh(RefreshMode.KeepChanges, entitylist); 
    // query is executed here 
    listBoxEntities.DataSource = entitylist; 
} 

棘手的时刻,实体从数据库中OrderInt字段值排序数据库(即原来的排序)返回。但是,当这些查询结果映射到内存对象时,将使用具有更改值的实例。 因此,您有本地更改的值的实体按照数据库值顺序排序。

您如何修复 - 只需更新时,您是在本地更改它的数据库值:

private void ChangeOrder(int argIDPK, int argNewPosition) 
{ 
    DisplayEntity tempe = entitylist.First(e => e.IDPK == argIDPK); 
    tempe.OrderInt = argNewPosition; 
    dbcontext.SubmitChanges(); // here we update database 
    RefreshList(); 
} 

或使用IQueryable,而不是在这里内存中的列表:即使使用两个IQueryable的

List<DisplayEntity> entitylist = null; 

private void WindowForm_Load(object sender, EventArgs e) 
{ 
    // query is executed only here 
    entitylist = dbcontext.Entities.OrderBy(e => e.OrderInt).ToList(); 
    RefreshList(); 
} 

private void RefreshList() 
{  
    listBoxEntities.DataSource = entitylist.OrderBy(e => e.OrderInt).ToList(); 
} 

private void ChangeOrder(int argIDPK, int argNewPosition) 
{ 
    DisplayEntity tempe = entitylist.First(e => e.IDPK == argIDPK); 
    tempe.OrderInt = argNewPosition; 
    RefreshList(); 
} 
+0

是的!我认为使用List <>得到了它!我碰巧已经设置了dbcontext.ObjectTrackingEnabled = true;如果这在SubmitChanges()调用中有所不同。 – stackuser83

相关问题