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!

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top