0

在 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;
    }
4

0 回答 0