排除要删除的集合,Linq

时间:2017-06-15 11:49:18

标签: c# linq except

我试图让except方法像这个答案一样工作: https://stackoverflow.com/a/3944821/169714

第一次尝试:

var housesToRemove = db.Houses.Except(houses).ToList();

第二次尝试:

var housesToRemove = db.Houses.Where(h => 
     !houses.Any(h2 => h2.Code.Equals(h.Code) && h2.OperatorId == h.OperatorId)).ToList();

我的Houses类已覆盖等于:

public override bool Equals(object obj)
{
    var item = obj as House;

    if (item == null)
        return false;

    return this.Code == item.Code && this.OperatorId == item.OperatorId;
}

public override int GetHashCode()
{
    return this.ID.GetHashCode();
}

两个选项抛出:

  

System.NotSupportedException:'无法创建类型为'House'的常量值。在此上下文中仅支持原始类型或枚举类型。'

我使用它的部分代码:

using (var db = new HouseContext())
{
    var housesToRemove = db.Houses.Where(h => !houses.Any(h2 => h2.Code.Equals(h.Code) && h2.OperatorId == h.OperatorId)).ToList();

    foreach (var htr in housesToRemove)
    {
        Console.WriteLine(htr); // I have also overwritten ToString() from House
    }
    housesToRemove.ForEach(x => x.IsListed = false);
    db.SaveChanges();
}

1 个答案:

答案 0 :(得分:1)

您关联的问题是使用 Linq to Entities ,而您正在使用 Linq to SQL ,这意味着您的Except查询已被发送到数据库。数据库没有关于你在这里尝试做什么的概念。

我建议您点击这里的答案:https://stackoverflow.com/a/18944508/639771,了解有关失败原因的更多信息,以及如何解决此问题。

<强> TL;博士

  

你正在尝试将内存中的对象与数据库对象进行比较,因为SQL引擎并没有对你的Equals覆盖有所了解,它所看到的只是一个内存中的House对象,并且调用了数据库它不知何故必须能够通过进行比较。您可以改为提升您不想要的房屋的ID,并执行以下操作:

var ids = houses.Select(h => h.Id).ToArray();
var filtered = db.Houses.Where(h => !ids.Contains(h.Id)).ToList();