43 votes

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':

  1. Sélectionnez les entités
  2. Modifier les entités
  3. 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?

46voto

hcris Points 9359

Vous pouvez réellement laissez-LINQ-to-SQL générer de la mise à jour des déclarations:

Foo foo=new Foo { FooId=fooId }; // create obj and set keys
context.Foos.Attach(foo);
foo.Name="test";
context.SubmitChanges();

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:

Foo foo=new Foo { FooId=fooId, Name="###" };
...
foo.Name=null;

Si vous voulez vérifier le timestamp pendant la mise à jour que vous pouvez faire ceci:

Foo foo=new Foo { FooId=fooId, Modified=... }; 
// Modified needs to be set to UpdateCheck="Always" in the dbml

30voto

Randolpho Points 36512

Non, 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:

var qry = from product in dc.Products where Product.Name=='Foobar' select product;
var item = qry.Single();
item.Count = 0;
dc.SubmitChanges();

Si vous souhaitez faire le dosage:

var qry = from product in dc.Products where Product.Type==1 select product;
foreach(var item in qry)
{
  item.Count = 0;
}
dc.SubmitChanges();

Alternativement, vous pourriez écrire une requête de vous-même:

dc.ExecuteCommand("update Product set Count=0 where Type=1", null);

3voto

Pop Catalin Points 25033

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.

3voto

Shannon Davidson Points 216

Le PLINQO (http://plinqo.comle cadre est à l'aide de LINQ mise à jour par lot afin d'effectuer des mises à jour

contexte.De la tâche.Mise à jour(t => t.Id == 1, t2 => nouvelle Tâche {StatusId = 2});

Cela permettra d'effectuer une Tâche de mise à Jour Défini StatusId = 2 where Id = 1

-3voto

amit singh Points 9

Essayez ceci :

dbEntities.tblSearchItems.Where(t => t.SearchItemId == SearchItemId).ToList().ForEach(t => t.isNew = false);
dbEntities.SaveChanges();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X