L'utilisation de linq pour générer la mise à jour directe sans sélectionner
G'day tout le monde.
Je suis encore à apprendre LINQ donc pardonnez-moi si c'est naïf. Lorsque vous faites affaire avec SQL directement, vous pouvez générer des commandes de mise à jour avec des conditions, sans exécution d'une instruction select.
Quand je travaille avec linq me semble suivre le modèle de l':
- Sélectionner des entités
- Modifier les entités
- De soumettre les modifications
Ce que je veux faire, c'est une mise à jour directe à l'aide de linq et l'exécution différée. Est-il possible que l'exécution se fait directement en SQL, sans qu'aucune information ne soit transmise au client?
DataContext dc = new DataContext
var q = from product in dc.Products
where product.Type = 1
set product.Count = 0
dc.SubmitChanges
Donc, en substance, LINQ a toutes les informations dont il a besoin SANS l'aide d'une sélection pour générer une commande de mise à jour. Il serait exécuter le SQL:
Update Products Set Count = 0 Where Type = 1
Un mot clé comme "set" existent dans LINQ?
- actuellement accepté réponse est fausse - pouvez-vous sélectionnez le bon?
- Les réponses ci-dessous ne permettent pas de définir en fonction des mises à jour comme je l'ai décrit, mais ils sont intéressants.
Vous devez vous connecter pour publier un commentaire.
Pas, ni LINQ ni LINQ to SQL, basés sur les capacités de mise à jour.
Dans LINQ to SQL, vous devez interroger sur l'objet que vous souhaitez mettre à jour, mettre à jour les champs/propriétés, puis d'appeler SubmitChanges(). Par exemple:
Si vous souhaitez faire le dosage:
Sinon, vous pouvez écrire une requête de vous-même:
Vous pouvez réellement laissez-LINQ-to-SQL générer des instructions update:
Dans votre Dbml ensemble UpdateCheck="Jamais" pour toutes les propriétés.
Cela va générer une seule instruction de mise à jour sans avoir à effectuer une sélection en premier.
Une mise en garde: si vous voulez être en mesure de définir le Nom d'null vous devez initialiser votre foo objet à une valeur différente de sorte Linq peut détecter le changement:
Si vous voulez vérifier le timestamp pendant la mise à jour que vous pouvez faire ceci:
context.Foos.Attach(foo, original: new Foo { FooId = fooId });
. Ceci mettra à jour toutes les propriétés qui ne sont pas définies dans l'entité d'origine.La PLINQO (http://plinqo.com) est le framework à l'aide de LINQ mise à jour par lot afin d'effectuer des mises à jour
context.Task.Update(t => t.Id == 1, t2 => new Task {StatusId = 2});
Cela permettra d'effectuer un
Update Task Set StatusId = 2 Where Id = 1
Linq 2 SQL n'a pas de direct insert/update/delete équivalents de SQL. En V1, l'seules les mises à jour que vous pouvez faire à l'aide de linq est pensé SubmmitChanges sur le contexte ou si vous secours à sql.
Cependant, certaines personnes ont essayé de surmonter cette limitation de linq, en utilisant des implémentations.
Linq mise à jour par lot.
Utiliser cette méthode d'extension: EntityExtensionMethods.cs
De l'utiliser, assurez-vous que le
entity
objet que vous passez àUpdateOnSubmit
méthode a tous, la clé primaire de définir les propriétés de l'enregistrement que vous souhaitez mettre à jour. Cette méthode sera ensuite mise à jour de l'enregistrement avec les autres propriétés de laentity
objet sans tirer sur le record du premier.Après l'appel de
UpdateOnSubmit
, assurez-vous d'appelerSubmitChanges()
pour que les modifications s'appliquent.set
mise à jour est possible grâce à LINQ, vous pouvez utiliserAttachAll
méthode, mais je pense qu'il va encore exécuter des commandes de mise à JOUR pour chaque ligne. Ma solution n'est mise à jour directe sans sélectionner comme dans la question du titre, mais si votre question est de savoir comment faire les mise à jour par lot, l'on a accepté la réponse est correcte.Vous pouvez utiliser Entity Framework Extensions de la bibliothèque, il prend en charge mise à jour par lot et lot de fusion, cependant, la bibliothèque n'est pas libre:
Essayez ceci :