Ich versuche, die außer Methode zu bekommen wie in dieser Antwort zu arbeiten: https://stackoverflow.com/a/3944821/169714zur Entfernung Sammlung ausschließen, Linq
1. Versuch:
var housesToRemove = db.Houses.Except(houses).ToList();
2. Versuch:
var housesToRemove = db.Houses.Where(h =>
!houses.Any(h2 => h2.Code.Equals(h.Code) && h2.OperatorId == h.OperatorId)).ToList();
Meine Houses-Klasse hat Vorrang. Entspricht:
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();
}
beiden Optionen werfen:
System.NotSupportedException: ‚Es kann keine konstanten Wert des Typs schaffen 'Haus'. In diesem Kontext werden nur primitive Typen oder Aufzählungstypen unterstützt.
Teil des Codes, wo ich es verwenden:
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();
}
Dank, dachte ich, dass Linq (db.Houses) eine interne Liste von allem, was in Erinnerung hatte. –
@JPellemons Nein, es ist tatsächlich viel verrückter. Es basiert alles auf 'IQueryable', das die LINQ-Ausdrücke übernimmt und sie in SQL-Anweisungen übersetzt und dann an die Datenbank absetzt. So können Sie in einer Tabelle mit Millionen von Zeilen suchen, ohne zuerst alle Daten laden zu müssen. – Clint