データベースとそれにマッピングされた Entity Framework モデルがあります。データベースには、多数の列を持つテーブル「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 projected = Context.Products.ToProjectedProduct().ToArray();
ここで、次のように、製品の単一のインスタンスにも同じ射影を使用したいと考えています。
var prod = Context.Products.First(p => p);
var projected = new ProjectedProduct { ProdID = prod.ID, ProdTitle = prod.Title });
そして、投影を 1 か所に配置するために同じヘルパー メソッドを使用したいのですが、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();
しかし、ヘルパー メソッドをデータベース クエリに変換できないため、これは機能しません。