Linq zu nhibernate Bulk Update Abfrageäquivalent?
-
22-09-2019 - |
Frage
Ich bin mir nicht sicher, ob ich hier etwas fehlt. Grundsätzlich suche ich nach LINQ zu NHiNRNATE, um die folgende SQL -Anweisung vorzunehmen:
update SomeTable
set SomeInteger = (SomeInteger + 1)
where SomeInteger > @NotSoMagicNumber
Gibt es eine Möglichkeit, das zu tun?
Vielen Dank!
Lösung
Linq (nicht linq zu nhibernate, linq im Allgemeinen) hat kein Massen -Update -Verb wie SQL. Wenn Sie die Effizienz der Bulk -Update -Erklärung wie Ihre benötigen, würde ich mich einfach bei SQL halten.
Andere Tipps
Späte Antwort, aber es gibt jetzt in Nhibernate 5.0.
//
// Summary:
// Update all entities selected by the specified query. The update operation is
// performed in the database without reading the entities out of it.
//
// Parameters:
// source:
// The query matching the entities to update.
//
// expression:
// The update setters expressed as a member initialization of updated entities,
// e.g. x => new Dog { Name = x.Name, Age = x.Age + 5 }. Unset members are ignored
// and left untouched.
//
// Type parameters:
// TSource:
// The type of the elements of source.
//
// Returns:
// The number of updated entities.
public static int Update<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, TSource>> expression);
In Ihrem Fall :
session.Query<SomeObject>()
.Update(i => new SomeObject { SomeInteger = i.SomeInteger + 1 });
Danke Nhibernate Team!
Wie die meisten (wenn nicht alle) Linq -Anbieter sind LINQ zu NHiberNate nur zum Lesen von Daten nützlich.
Um das zu erreichen, was Sie in Nhibernate mit Hilfe von Linq tun möchten, möchten Sie alle relevanten Objekte abrufen und jeden einzelnen aktualisieren. Etwas wie:
//NHibernate session initialisation & finalisation skipped for brevity
var relevantObjects = from i in session.Linq<SomeObject>()
where i.SomeInteger > notSoMagicNumber
select i;
foreach (SomeObject item in relevantObjects)
{
i.SomeInteger++;
session.Update(item);
}
Stellen Sie sicher, dass Sie Ihre Sitzung danach spülen und alles in einer Transaktion einwickeln, um die Anzahl der Datenbankaktualisierungen zu minimieren.
All dies heißt, abhängig von der Größe Ihrer Daten können Sie Leistungsprobleme bei der Verwendung von NHiNRNATE für Bulk -Operationen aufnehmen. Mit an ein IStatelessSession
kann zu diesem Zweck helfen, aber ich habe es selbst nicht ausprobiert.
AKTUALISIEREN Es stellt sich heraus, dass Sie es nicht tun müssen session.Update
oder spülen Sie die Sitzung.