在 EntityFramework 4 中,这是从以下获取实体的正确方法:
- 数据库(减去 Deleted 对象),
- 和内存中添加的对象
以在 GridView 中显示它们?
使用 linq 到实体我得到当前数据库中的数据。
使用ObjectStateManager.GetObjectStateEntries(entityState).Select(ent => ent.Entity).OfType<IEntityWithKey>()
,我得到添加和/或删除(根据需要)
使用 linq to entity 我在查询结果中获得了 Deleted 对象,因此它们显示在 gridvew 中(以及 Modified 和 Unchanged),但这不是我想要的,我不想要 Deleted 对象。
我需要在网格视图中显示当前数据库中的所有数据,除了已删除的对象,以及内存中添加的对象。(所有这些都是在调用 Savechanges 之前)。
我在 BL 类中有一个方法,它返回一个类型化的集合并用它设置一个 gridview 数据源。
为了实现这一点,我这样做:
- 对实体的 linq 以检索数据库数据(比如说 Collection1),
- GetObjectStateEntries(Deleted) 以获取已删除的实体 (Collection2),
- GetObjectStateEntries(Added) 以获取新的内存添加(Collection3 )
然后迭代 Collection1.ToList() 以删除 Collection2 中的项目,然后是与 Collection3 的 Union。
它有效,但我不喜欢它。
有没有更好/正确的方法来做到这一点?请问有什么帮助/建议吗?
提前谢谢。
这是一些代码。
获取数据库实体的方法(此处包括已删除的对象):
public IEnumerable<ConnectorTransformationLookUpConceptData> GetConnectorTransformationLookUpConceptsView(int idConnectorTransformation)
{
var data = from r in Entities.ConnectorTransformationLookUpConcept
join c in Entities.LookUpConcept on r.IdLookUpConcept equals c.IdLookUpConcept
....
return ExcludeDeleted(data).Union(AddedData(idConnectorTransformation)).OrderBy(e => e.Concept);
}
删除已删除对象的方法(在之前的返回中调用):
private List<ConnectorTransformationLookUpConceptData> ExcludeDeleted(IEnumerable<ConnectorTransformationLookUpConceptData> collection)
{
List<ConnectorTransformationLookUpConceptData> l = collection.ToList();
var deleted = GetDeletedEntities<ConnectorTransformationLookUpConcept>();
foreach (ConnectorTransformationLookUpConcept d in deleted)
{
ConnectorTransformationLookUpConceptData o = l.Find(c => c.idConnTransf == d.IdConnectorTransformation && c.idLooUpConcept == d.IdLookUpConcept);
if (o != null) l.Remove(o);
}
return l;
}
由先前的“AddedData”和“GetDeletedEntities”调用最终调用的方法,该方法返回所需的对象(在 EntityState.Added 或 EntityState.Deleted 中)
protected IEnumerable<IEntityWithKey> GetEntities<IEntityWithKey>(EntityState entityState)
{
IEnumerable<IEntityWithKey> data =
this.Entities.ObjectStateManager.
GetObjectStateEntries(entityState).
Select(ent => ent.Entity).
OfType<IEntityWithKey>();
return data;
}