Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将数据映射表达式作为编译表达式重用?_C#_Entity Framework 6 - Fatal编程技术网

C# 如何将数据映射表达式作为编译表达式重用?

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

我在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 => 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;}
}