从通用列表中删除项目不起作用

时间:2018-08-13 20:14:21

标签: c# entity-framework linq

我正在尝试从列表中删除一个项目。它会通过上述查询找到该项目,但不会将其从列表中删除。我不知道为什么会这样?

var qry = db.AssemblyListItems
          .AsNoTracking()
          .Where(x => x.ProductionPlanID == (long)_currentPlan.ProductionPlan)
          .ToList();

var hasbeenAssembled = db.Assembleds
                       .AsNoTracking()
                       .Where(x => x.ProductionPlanId == (long)_currentPlan.ProductionPlan)
                       .ToList();


foreach (var item in hasbeenAssembled)
{
    qry = qry.RemoveAll(X => X.DocumentNo == item.DocumentId && 
                        X.ItemCode == item.KitHeaderId && 
                        X.ProductionPlanID == item.ProductionPlanId );
}

olvData.SetObjects(qry); 

上面是一个listView,我希望这些项目出现在其中。主要查询“ qry”在顶部。

3 个答案:

答案 0 :(得分:1)

您可以通过在子查询的列表中排除已组装的项目来处理所有这些查询:

var productionPlan = (long)_currentPlan.ProductionPlan;
var qry = db.AssemblyListItems
    .AsNoTracking()
    .Where(item => item.ProductionPlanID == productionPlan
                && !db.Assembleds
                      .Any(x => x.ProductionPlanId == item.ProductionPlanID
                             && x.DocumentNo == item.DocumentId 
                             && x.ItemCode == item.KitHeaderId))

(正如其他人所说的那样)优点是您不会将AssemblyListItems拖入内存中,以后您将再次丢弃它。 Entity Framework可以将其转换为一条SQL语句,因此数据库可以有效地处理一切。

答案 1 :(得分:0)

不要在查询结果中包含不需要的项目。当数据库可能为您处理查询时,请不要过早从数据库中获取查询结果。

 colors = [
     {id: 1, label: 'Red'},
     {id: 2, label: 'Yellow'},
     {id: 3, label: 'Green'}
 ]

 selectedId = colors[0].id;

答案 2 :(得分:0)

更简单的方法。第一个列表中的项目在第二个列表中不存在。

from item in hasbeenAssembled
where !(qry.Any(X => X.DocumentNo == item.DocumentId && 
                        X.ItemCode == item.KitHeaderId && 
                        X.ProductionPlanID == item.ProductionPlanId))
select item;