C# 共享投影?

C# 共享投影?,c#,entity-framework-5,projection,C#,Entity Framework 5,Projection,我有一个数据库和一个实体框架模型映射到它。该数据库有一个包含许多列的表“Products”。在许多EF查询中,我只需要几列,比如说,我做一个投影 var projected = Context.Products .Select(p => new ProjectedProduct { ProdID = p.ID, ProdTitle = p.Title }) .ToArray(); 由于此投影已被多次使用,我将其移动到一个单独的方法: public static IQuer

我有一个数据库和一个实体框架模型映射到它。该数据库有一个包含许多列的表“Products”。在许多EF查询中,我只需要几列,比如说,我做一个投影

var projected = Context.Products
    .Select(p => new ProjectedProduct { ProdID = p.ID, ProdTitle = p.Title })
    .ToArray();
由于此投影已被多次使用,我将其移动到一个单独的方法:

public static IQueryable<ProjectedProduct> ToProjectedProduct(this IQueryable<Product> query)
{
    return query.Select(p => 
        new ProjectedProduct { ProdID = p.ID, ProdTitle = p.Title });
}
现在我还想对产品的单个实例使用相同的投影,如:

var prod = Context.Products.First(p => p);
var projected = new ProjectedProduct { ProdID = prod.ID, ProdTitle = prod.Title });
我仍然希望对投影使用相同的辅助方法,以便将它放在一个位置,但它不起作用,因为它只对IQueryable有效。我能做的就是把投影转换成另一种方法,比如

public static ProjectedProduct ToProjectedProduct(this Product p)
{
    return new ProjectedProduct { ProdID = p.ID, ProdTitle = p.Title });
}
但现在这种方法对IQueryable不起作用。我需要一个适用于这两种情况的助手方法,我想做的是:

var projected = Context.Products.Select(p => p.ToProjectedProduct()).ToArray();
但这不起作用,因为无法将helper方法转换为数据库查询。

用于此。使用Automapper,您可以执行以下操作:

Mapper.CreateMap<Product, ProjectedProduct>
    .ForMember(dto => dto.ProdID, m => m.MapFrom(p => p.ID))
    .ForMember(dto => dto.ProdTitle , m => m.MapFrom(p => p.Title));
var projected = Context.Products.Project().To<ProjectedProduct>().ToArray();
Automapper被广泛使用,您会发现许多如何使用它的示例。

请使用它。使用Automapper,您可以执行以下操作:

Mapper.CreateMap<Product, ProjectedProduct>
    .ForMember(dto => dto.ProdID, m => m.MapFrom(p => p.ID))
    .ForMember(dto => dto.ProdTitle , m => m.MapFrom(p => p.Title));
var projected = Context.Products.Project().To<ProjectedProduct>().ToArray();

Automapper被广泛使用,您会发现许多如何使用它的示例。

IQueryable的选择扩展方法需要一个
表达式。这意味着我们可以在别处定义一个与此参数匹配的对象,并将其传递到select语句中

属性(也可以是方法):

单实例使用:

var projected = Context.Products.Select(MapProduct).First();
IEnumerable用法:

var projected = Context.Products
    .Select(MapProduct)
    .ToArray();
// calling compile turns the expression into a normal Func
var projected = ProductList.Select(MapProduct.Compile());
正常对象使用:

var projected = MapProduct.Compile()(ProdObj);

MSDN IQueryable.Select-

IQueryable的Select扩展方法需要一个
表达式。这意味着我们可以在别处定义一个与此参数匹配的对象,并将其传递到select语句中

属性(也可以是方法):

单实例使用:

var projected = Context.Products.Select(MapProduct).First();
IEnumerable用法:

var projected = Context.Products
    .Select(MapProduct)
    .ToArray();
// calling compile turns the expression into a normal Func
var projected = ProductList.Select(MapProduct.Compile());
正常对象使用:

var projected = MapProduct.Compile()(ProdObj);

MSDN IQueryable.Select-

此自动映射表达式是否会正确转换为SQL Server查询?是的,这是构建
Project()的最大好处。看,有趣的解决方案,谢谢。请记住,Automapper有能力做到这一点。总有一天你会开始使用它。比编写表达式更容易,尤其是当投影数增加时。:)这个Automapper表达式能正确地转换为SQL Server查询吗?是的,这是
Project()到
构造的伟大之处。看,有趣的解决方案,谢谢。请记住,Automapper有能力做到这一点。总有一天你会开始使用它。比编写表达式更容易,尤其是当投影数增加时。:)谢谢,这就是我要找的。我以为应该是有表情的,但我自己没能解决。谢谢,这就是我要找的。我原以为这应该是有表情的,但我自己也没能解决。