【问题标题】:EF4 DbContext LINQ query where entity not marked for deletionEF4 DbContext LINQ 查询,其中实体未标记为删除
【发布时间】:2015-08-21 00:07:41
【问题描述】:

我似乎无法找到一种方法(想知道是否确实可能)对 DBContext 执行 LINQ 查询,只给出未标记为删除的项目。

例如

// Mark one or more items in the DBContext for deletion.
(from di in DbContext.DeliveryItems where di.Id == myId select di).ToList().ForEach(di => this.Context.DeleteObject(di));

然后我可以执行一个忽略已删除对象的查询(当然不必触发 SaveChanges())吗?

decimal? weight = (from s in this.Context.Stocks
                   where di.Id == myId
                   select s.GrossWeight).Sum();

即我只想要未标记为删除的股票实体的权重总和。

编辑: 无法让 ChangeTracker() 参考工作,所以最终做了以下...

List<int> deletedDeliveryItems = this.Context.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Deleted)
                                 .Where(x => x.EntityKey.EntitySetName == "DeliveryItems")
                                 .Select(x => ((DeliveryItem)x.Entity).Id).ToList();

decimal? sumWeightOfDeletedDeliveryItems = (from s in DbContext.Stocks
                                            where deletedDeliveryItems.Count > 0 &&
                                            deletedDeliveryItems.Contains(s.Id)
                                            select s.GrossWeight).Sum();

【问题讨论】:

    标签: c# linq entity-framework-4 dbcontext


    【解决方案1】:
    var delete = (from di in DbContext.DeliveryItems where di.Id == myId select di).ToList();
    
    delete.ForEach(di => this.Context.DeleteObject(di));
    
    decimal? weight = (from s in this.Context.Stocks
                       where !delete.Select(di => di.Id).Contains(s.SomeId)
                       select s.GrossWeight).Sum();
    

    如果您出于某种原因需要从DbContext 获取已删除的项目。你可以这样做:

    var deleted = context.ChangeTracker.Entries()
                   .Where(x => x.State == System.Data.EntityState.Deleted)
                   .Select(x=> x.Entity).ToList();
    

    【讨论】:

    • 啊好主意,只见树木不见森林!我现在将使用 id 列表,就像您暗示的那样,无需再次查询上下文。谢谢!
    猜你喜欢
    • 2023-03-11
    • 2023-03-20
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    相关资源
    最近更新 更多