@@ -467,6 +467,101 @@ IList<Cat> oldCats =
467
467
.ToList();]]> </programlisting >
468
468
</sect1 >
469
469
470
+ <sect1 id =" querylinq-modifying" >
471
+ <title >Modifying entities inside the database</title >
472
+
473
+ <para >
474
+ Beginning with NHibernate 5.0, Linq queries can be used for inserting, updating or deleting entities.
475
+ The query defines the data to delete, update or insert, and then <literal >Delete</literal >,
476
+ <literal >Update</literal > and <literal >Insert</literal > queryable extension methods allow to delete it,
477
+ or instruct in which way it should updated or inserted. Those queries happen entirely inside the
478
+ database, without extracting corresponding entities out of the database.
479
+ </para >
480
+ <para >
481
+ These operations are a Linq implementation of <xref linkend =" batch-direct" />, with the same abilities
482
+ and limitations.
483
+ </para >
484
+
485
+ <sect2 id =" querylinq-modifying-insert" >
486
+ <title >Inserting new entities</title >
487
+ <para >
488
+ <literal >Insert</literal > method extension expects a NHibernate queryable defining the data source of
489
+ the insert. This data can be entities or a projection. Then it allows specifying the target entity type
490
+ to insert, and how to convert source data to those target entities. Two forms of target specification
491
+ exist.
492
+ </para >
493
+ <para >
494
+ Using projection to target entity:
495
+ </para >
496
+ <programlisting ><![CDATA[ session.Query<Cat>()
497
+ .Where(c => c.BodyWeight > 20)
498
+ .Insert()
499
+ .As(c => new Dog { Name = c.Name + "dog", BodyWeight = c.BodyWeight });]]> </programlisting >
500
+ <para >
501
+ Or using assignments:
502
+ </para >
503
+ <programlisting ><![CDATA[ session.Query<Cat>()
504
+ .Where(c => c.BodyWeight > 20)
505
+ .Insert()
506
+ .Into<Dog>(a => a
507
+ .Set(d => d.Name, c => c.Name + "dog")
508
+ .Set(d => d.BodyWeight, c => c.BodyWeight));]]> </programlisting >
509
+ <para >
510
+ In both cases, unspecified properties are not included in the resulting SQL insert.
511
+ <link linkend =" mapping-declaration-version" ><literal >version</literal ></link > and
512
+ <link linkend =" mapping-declaration-timestamp" ><literal >timestamp</literal ></link > properties are
513
+ exceptions. If not specified, they are inserted with their <literal >seed</literal > value.
514
+ </para >
515
+ <para >
516
+ For more information on <literal >Insert</literal > limitations, please refer to
517
+ <xref linkend =" batch-direct" />.
518
+ </para >
519
+ </sect2 >
520
+
521
+ <sect2 id =" querylinq-modifying-update" >
522
+ <title >Updating entities</title >
523
+ <para >
524
+ <literal >Update</literal > method extension expects a queryable defining the entities to update.
525
+ Then it allows specifying which properties should be updated with which values. As for
526
+ <literal >Insert</literal >, two forms of target specification exist.
527
+ </para >
528
+ <para >
529
+ Using projection to updated entity:
530
+ </para >
531
+ <programlisting ><![CDATA[ session.Query<Cat>()
532
+ .Where(c => c.BodyWeight > 20)
533
+ .Update()
534
+ .As(c => new Cat { BodyWeight = c.BodyWeight / 2 });]]> </programlisting >
535
+ <para >
536
+ Or using assignments:
537
+ </para >
538
+ <programlisting ><![CDATA[ session.Query<Cat>()
539
+ .Where(c => c.BodyWeight > 20)
540
+ .Update()
541
+ .Assign(a => a
542
+ .Set(c => c.BodyWeight, c => c.BodyWeight / 2));]]> </programlisting >
543
+ <para >
544
+ In both cases, unspecified properties are not included in the resulting SQL update. This could
545
+ be changed for <link linkend =" mapping-declaration-version" ><literal >version</literal ></link > and
546
+ <link linkend =" mapping-declaration-timestamp" ><literal >timestamp</literal ></link > properties:
547
+ <literal >As</literal > and <literal >Assign</literal > methods take an optional boolean parameter,
548
+ <literal >versioned</literal >, which allows incrementing the version. Custom version types
549
+ (<literal >NHibernate.Usertype.IUserVersionType</literal >) are not supported.
550
+ </para >
551
+ </sect2 >
552
+
553
+ <sect2 id =" querylinq-modifying-delete" >
554
+ <title >Deleting entities</title >
555
+ <para >
556
+ <literal >Delete</literal > method extension expects a queryable defining the entities to delete.
557
+ It immediately deletes them.
558
+ </para >
559
+ <programlisting ><![CDATA[ session.Query<Cat>()
560
+ .Where(c => c.BodyWeight > 20)
561
+ .Delete();]]> </programlisting >
562
+ </sect2 >
563
+ </sect1 >
564
+
470
565
<sect1 id =" querylinq-querycache" >
471
566
<title >Query cache</title >
472
567
0 commit comments