Как использовать конструктор копирования в запросе LINQ to Entities? - PullRequest
0 голосов
/ 27 июня 2018

Я работаю над выражением Linq, в котором я получаю объект из DBContext, и я хочу сделать его пользовательским объектом ViewModel

мой ViewModel получает в качестве параметра объект, полученный из DBContext, для обработки информации и ее полного возврата

Это маленький пример

public class Obj1 // Object i get from database
{
   public int id { get; set; }
   public string Param { get; set; }
   public string Param2 { get; set; }
   public string Random { get; set; }
}

public class Obj2 //ViewModel
{
   public string ParamFormateado { get; set; }
   public string  Random { get; set; }

   public Obj2(Obj1 parametro)
   {
     ParamFormateado = parametro.Param + parametro.Param2;
     Random = parametro.Random;
   }

}

Я пытаюсь получить Obj2 с выражением Linq, которое возвращает Obj1 без преобразования информации в выражение linq, поскольку в моем случае это становится в основном неразборчивым выражением

Я попробовал что-то подобное

Obj2 objeto = db.Obj1.Where(x => x.id == "0").Select(x => new Obj2(x)).FirstOrDefault();

Можно ли выполнить Linq запрос, аналогичный тому, который я предлагаю? в противном случае я получаю чрезвычайно длинные Linq выражения для форматирования этой информации, но что будет лучшей альтернативой в этих случаях?

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Не делай этого с Линком так. Вы должны создать метод, который принимает obj1 в качестве параметра, сопоставляет свойства и затем возвращает obj2. Или используйте Automapper из репозитория nuget.

сделай так

public obj2 Map(obj1 source)
{
   var destination = new obj2();
   destination.param1 = source.param1;
   //
   return destination;
}

если вы хотите передать коллекцию объектов, просто сделайте это и просто переходите по списку и возвращайте список отображенных объектов. Но я бы посоветовал вам использовать Automapper, поскольку он автоматизирует процесс, и вам не нужно писать длинный код отображения.

0 голосов
/ 27 июня 2018

Вы не можете сделать это, потому что поддерживаются только конструкторы без параметров. Но вы можете сделать это с помощью Linq-To-Objects, который может быть принудительно установлен с помощью AsEnumerable:

Obj2 objeto = db.Obj1
   .Where(x => x.id == "0")
   .AsEnumerable()   // <--- here
   .Select(x => new Obj2(x))
   .FirstOrDefault();

Таким образом, в базе данных будет выполняться только фильтр с Where, остальные записи обрабатываются в процессе.

https://codeblog.jonskeet.uk/2011/01/14/reimplementing-linq-to-objects-part-36-asenumerable/

...