我有一个数据库和一个映射到它的实体框架模型。该数据库有一个包含许多列的“产品”表。在许多 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 projected = Context.Products.ToProjectedProduct().ToArray();
现在我还想对单个产品实例使用相同的投影,例如:
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();
但这不起作用,因为辅助方法无法转换为数据库查询。