如何将数据映射表达式重用为已编译的表达式?
How to reuse data mapping Expression as a compiled Expression?
我在 LinqPad 中有这段代码:
void Main() {
var a = Product.Select( DDL.ToDDL).Take(1).Dump();
}
使用此 POCO class 成功查询 SQL 两个 table 字段而不是所有字段(不确定内部静态是否使外部 class 静态也是):
public class DDL {
public static readonly Expression<Func<Product, DDL>> ToDDL =
o => new DDL {
id = o.identifier,
name = o.pbfeattext
};
public int id {get;set;}
public string name {get;set;}
}
所以我想这样写第一行代码:
var a = Product.Select(o => o.AsDDL()).Take(1).Dump();
我试过写这段代码:
public static class DDL3 {
public static DDL AsDDL (this Product p) {
return new DDL {
id = p.identifier,
name = p.pbfeattext
};
}
}
这会产生相同的结果,但它会检索 SQL 中的整个 Product 记录,而不仅仅是我们需要的两个字段。我也试过这段代码,但它需要做 var a = Product.AsDDL().Take(1).Dump();
。我需要另一种形式 (o => o.AsDDL())
。 (我什至尝试过使用构造函数,但 SQL 不理解那种形式的函数。)
public static class DDL3
{
public static DDL AsDDL (this Product p)
{
return new DDL {
id = p.identifier,
name = p.pbfeattext
};
}
}
如何编写 Linq 表达式的代码?
AutoMapper
可能适合您。看到这个:https://github.com/AutoMapper/AutoMapper/wiki/Queryable-Extensions
它需要配置一次映射,但之后,您可以随时重复使用 DTO 映射。
这里有一个例子:
public List<OrderLineDTO> GetLinesForOrder(int orderId)
{
Mapper.CreateMap<OrderLine, OrderLineDTO>()
.ForMember(dto => dto.Item, conf => conf.MapFrom(ol => ol.Item.Name);
using (var context = new orderEntities())
{
return context.OrderLines.Where(ol => ol.OrderId == orderId)
.Project().To<OrderLineDTO>().ToList();
}
}
这对我有用。我按上面的方式定义表达式,然后在其正下方的表达式上进行编译。这实际上是一个采用 POCO 并将其映射到自身的视图模型。您可以向方法添加属性,以便 JSON.NET 不会序列化它们(假设...) Map 和 ToMap 的原因首先用于投影 Entity Framework 中的字段,例如, other 用于 in-ram 集合。
public class DDL {
public static readonly Expression<Func<Product, DDL>> Map =
o => new DDL {
id = o.identifier,
name = o.pbfeattext
};
public static readonly Func<Product, DDL> ToMap =
DDL.Map.Compile();
public int id {get;set;}
public string name {get;set;}
}
我在 LinqPad 中有这段代码:
void Main() {
var a = Product.Select( DDL.ToDDL).Take(1).Dump();
}
使用此 POCO class 成功查询 SQL 两个 table 字段而不是所有字段(不确定内部静态是否使外部 class 静态也是):
public class DDL {
public static readonly Expression<Func<Product, DDL>> ToDDL =
o => new DDL {
id = o.identifier,
name = o.pbfeattext
};
public int id {get;set;}
public string name {get;set;}
}
所以我想这样写第一行代码:
var a = Product.Select(o => o.AsDDL()).Take(1).Dump();
我试过写这段代码:
public static class DDL3 {
public static DDL AsDDL (this Product p) {
return new DDL {
id = p.identifier,
name = p.pbfeattext
};
}
}
这会产生相同的结果,但它会检索 SQL 中的整个 Product 记录,而不仅仅是我们需要的两个字段。我也试过这段代码,但它需要做 var a = Product.AsDDL().Take(1).Dump();
。我需要另一种形式 (o => o.AsDDL())
。 (我什至尝试过使用构造函数,但 SQL 不理解那种形式的函数。)
public static class DDL3
{
public static DDL AsDDL (this Product p)
{
return new DDL {
id = p.identifier,
name = p.pbfeattext
};
}
}
如何编写 Linq 表达式的代码?
AutoMapper
可能适合您。看到这个:https://github.com/AutoMapper/AutoMapper/wiki/Queryable-Extensions
它需要配置一次映射,但之后,您可以随时重复使用 DTO 映射。
这里有一个例子:
public List<OrderLineDTO> GetLinesForOrder(int orderId)
{
Mapper.CreateMap<OrderLine, OrderLineDTO>()
.ForMember(dto => dto.Item, conf => conf.MapFrom(ol => ol.Item.Name);
using (var context = new orderEntities())
{
return context.OrderLines.Where(ol => ol.OrderId == orderId)
.Project().To<OrderLineDTO>().ToList();
}
}
这对我有用。我按上面的方式定义表达式,然后在其正下方的表达式上进行编译。这实际上是一个采用 POCO 并将其映射到自身的视图模型。您可以向方法添加属性,以便 JSON.NET 不会序列化它们(假设...) Map 和 ToMap 的原因首先用于投影 Entity Framework 中的字段,例如, other 用于 in-ram 集合。
public class DDL {
public static readonly Expression<Func<Product, DDL>> Map =
o => new DDL {
id = o.identifier,
name = o.pbfeattext
};
public static readonly Func<Product, DDL> ToMap =
DDL.Map.Compile();
public int id {get;set;}
public string name {get;set;}
}