如何在 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,因为它可以自动执行过程,您不必编写很长的映射代码。
我正在处理一个 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,因为它可以自动执行过程,您不必编写很长的映射代码。