如何在 LINQ to Entities 查询中使用复制构造函数?

How to use a copy-constructor in a LINQ to Entities query?

我正在处理一个 Linq 表达式,我在其中从 DBContext 获取一个对象,我想将其设为自定义 ViewModel 对象

我的 ViewModel 接收一个从 DBContext 获得的对象作为参数来处理信息并且 return 它完全

这是一个小例子

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 和一个 return 一个 Obj1 的 Linq 表达式,而不转换 linq 表达式中的信息,因为在我的例子中它变成了一个基本难以辨认的表达

我正在尝试这样的事情

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

是否可以执行与我提议的类似的 Linq 查询?否则,我最终会用非常长的 Linq 表达式来格式化此信息,但在这些情况下最好的选择是什么?

你不能那样做,因为只支持无参数构造函数。但是你可以用 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/

不要那样使用 Linq。您必须创建一个将 obj1 作为参数、映射属性然后 returns obj2 的方法。或者使用 nuget 存储库中的 Automapper。

这样做

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

如果你想传递一个对象集合,那么就这样做,然后通过列表和 return 映射对象列表进行遍历。但我建议您使用 Automapper,因为它可以自动执行过程,您不必编写很长的映射代码。