Pregunta

No estoy seguro si me falta nada aquí. Básicamente, Busco LINQ a Nhibernate hacer la siguiente instrucción SQL:

update SomeTable
set SomeInteger = (SomeInteger + 1)
where SomeInteger > @NotSoMagicNumber

¿Hay alguna manera de hacer eso?

Gracias!

¿Fue útil?

Solución

LINQ (no LINQ to NHibernate, LINQ en general) no tiene una actualización masiva verbo como SQL tiene. Si necesita la eficiencia de la declaración de actualización masiva como la suya, yo sólo se adhieren a SQL.

Otros consejos

respuesta tardía pero ahora existe en 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);

En su caso:

    session.Query<SomeObject>()
            .Update(i => new SomeObject { SomeInteger = i.SomeInteger + 1 });

Gracias equipo de NHibernate!

Como la mayoría (si no todos) los proveedores de LINQ, LINQ to NHibernate sólo viene en útil en la lectura de datos.

Para lograr lo que quiere hacer en NHibernate con la ayuda de LINQ, tendrá que ir a buscar a todos los objetos relevantes y actualizar cada uno de ellos. Algo así como:

//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);
}

Asegúrese de que se enjuaguen la sesión después de todo esto, y lo envuelve todo en una transacción para reducir al mínimo el número de cambios de base de datos.

Dicho todo esto, dependiendo del tamaño de los datos, es posible que encuentre problemas de rendimiento en el uso de NHibernate para las operaciones a granel. El uso de un IStatelessSession puede ayudar a tal efecto, pero no lo he probado a mí mismo.

Actualizar Resulta que si se envuelve en una transacción, no es necesario hacer session.Update o eliminar la sesión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top