C# 如何将数据映射表达式作为编译表达式重用?
我在LinqPad中有以下代码:C# 如何将数据映射表达式作为编译表达式重用?,c#,entity-framework-6,C#,Entity Framework 6,我在LinqPad中有以下代码: void Main() { var a = Product.Select( DDL.ToDDL).Take(1).Dump(); } 使用此POCO类成功查询SQL中的两个表字段,而不是所有表字段不确定内部静态是否也使外部类静态: public class DDL { public static readonly Expression<Func<Product, DDL>> ToDDL = o =&g
void Main() {
var a = Product.Select( DDL.ToDDL).Take(1).Dump();
}
使用此POCO类成功查询SQL中的两个表字段,而不是所有表字段不确定内部静态是否也使外部类静态:
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;}
}
我尝试过编写以下代码:
public static class DDL3 {
public static DDL AsDDL (this Product p) {
return new DDL {
id = p.identifier,
name = p.pbfeattext
};
}
}
这会产生相同的结果,但它会检索SQL中的整个产品记录,而不仅仅是我们需要的两个字段。我也尝试过这段代码,但它需要执行var a=Product.AsDDL.Take1.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可能适合您。见此:
它需要配置一次映射,但在这之后,您可以随时重用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的原因是,第一个用于在实体框架中投影字段,另一个用于在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;}
}
正确的方法与第一个示例中的方法完全相同。你知道,就是那个工作正常的。@Servy所以没有办法像o=>o.AsDDL那样做吗?这不是问一个实用的答案,而是问它是否可能。当然,你可以从POCO中找出功能。我还没有弄明白如何对委托执行扩展方法。我很想了解否决票背后的原因。
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;}
}