Пакетное обновление Entity Framework Z Plus - PullRequest
0 голосов
/ 18 сентября 2018

Я использую метод пакетного обновления Entity Framework Z Plus. Я не могу продолжить из-за проблемы ниже. На самом деле метод обновления работает хорошо, когда я даю статические значения, такие как tagName="amir1". Но мне нужно получить Tagdescription из веб-службы или из другой коллекции, основанной на tagId, метод обновления не принимает метод расширения или любой другой метод для выполнения моего требования. Например,

"LINQ to Entities не распознает метод метода System.String GetTagDescription (Int32) ', и этот метод нельзя преобразовать в выражение хранилища.".

Надеюсь, мое требование теперь ясно. Пожалуйста, направьте меня, если есть другой подход к моему требованию.

Вот мой код:

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
}

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Отказ от ответственности : я владелец проекта Entity Framework Plus

К сожалению, невозможно использовать BatchUpdate со значением, которое меняется от строки к другой.

Отказ от ответственности : я владелец проекта Расширения Entity Framework

В этой ситуации мы обычно рекомендуем использовать нашу платную библиотеку, созданную для такого рода ситуаций и предлагающую высокопроизводительную операцию сохранения.

Пример

// Easiest way
context.BulkSaveChanges();

// Fastest way
context.BulkUpdate(tags);
0 голосов
/ 18 сентября 2018

Введите свой код следующим образом:

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
}
...