Mise à jour par lots Entity Framework Z Plus


Question

J'utilise la méthode de mise à jour par lots d'Entity Framework Z Plus. Je ne peux pas continuer en raison du problème ci-dessous. En fait, la méthode Update fonctionne bien lorsque je donne des valeurs statiques telles que tagName="amir1" . Mais je dois obtenir la Tagdescription partir d'un service Web ou d'une autre collection basée sur tagId . La méthode Update n'accepte pas une méthode d'extension ni aucune autre méthode pour accomplir mon exigence.

"LINQ to Entities ne reconnaît pas la méthode" System.String GetTagDescription (Int32) "et cette méthode ne peut pas être traduite en une expression de magasin.".

J'espère que mes exigences sont claires maintenant. Veuillez me guider s'il existe une autre approche pour mon exigence.

Voici mon code:

using (var context = new TrialsDBEntities())
{
     context.tblTags.Where(x => (tagIdCollection.Contains(x.tagId))).
                Update(m => new tblTag { tagDescription = m.tagId.GetTagDescription(), tagName = "amir1" });
}

public static string GetTagDescription(this int i)
{
     return "test" + i;

     ///Replace above line with call to database or web service call 
     getting some text by giving i as input
}

Réponse acceptée

Écrivez votre code comme suit:

using (var context = new TrialsDBEntities())
{
   var tagsToBeUpdated =  context.tblTags.Where(x => (tagIdCollection.Contains(x.tagId))).AsNoTracking().ToList();

   //Only use this code block if your tagsToBeUpdated list is too large
   Parallel.ForEach(tagsToBeUpdated, tagToBeUpdated =>
   {
      var tagDescription = GetTagDescription(tagToBeUpdated.tagId);
      tagToBeUpdated.tagDescription = tagDescription;
      context.Entry(tagToBeUpdated).State = EntityState.Modified;
   });

   //Only use this code block if your tagsToBeUpdated list is not too large
   foreach(var tagToBeUpdated in tagsToBeUpdated)
   {
      var tagDescription = GetTagDescription(tagToBeUpdated.tagId);
      tagToBeUpdated.tagDescription = tagDescription;
      context.Entry(tagToBeUpdated).State = EntityState.Modified;
   }

   context.SaveChanges();         
}

public static string GetTagDescription(int i)
{
     return "test" + i;

     ///Replace above line with call to database or web service call 
     //getting some text by giving i as input
}

Réponse d'expert

Disclaimer : Je suis propriétaire du projet Entity Framework Plus

Malheureusement, il n'est pas possible d'utiliser BatchUpdate avec une valeur qui change d'une ligne à une autre.

Avertissement : je suis propriétaire du projet Entity Framework Extensions

Dans cette situation, nous vous recommandons normalement d'utiliser notre bibliothèque payante conçue pour ce type de situation et offrant un fonctionnement de sauvegarde performant.

Exemple

// Easiest way
context.BulkSaveChanges();

// Fastest way
context.BulkUpdate(tags);




Sous licence: CC-BY-SA
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi