我试图让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();
}
答案 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();