LINQ to SQL を使用するアプリケーションを LINQ to Entities に変換中です。私はリポジトリ パターンを使用していますが、LINQ to SQL では機能するがエンティティでは機能しないという問題が発生しました。
データ レイヤーでは、LINQ ステートメントを使用してオブジェクト グラフを埋め、データベース エンティティが他の場所に公開されないようにしています。この例では、カテゴリのリストを返すルックアップ リポジトリがあります。次のようになります。
public IQueryable<Entities.DomainModels.Category> getCategories()
{
return (from c in Categories
where !c.inactive
orderby c.categoryName
select new Entities.DomainModels.Category
{
id = c.categoryID,
category = c.categoryName,
inactive = c.inactive
});
}
後で、カテゴリをサブクエリに入れたいと思います。これは次のようになります。
var d = from p in Programs
let categories = (from pc in p.Categories
join c in getCategories() on pc.categoryID equals c.id
select c)
select new
{
id = p.id,
title = p.title
categories = categories.ToList()
};
これを実行すると、次のエラーが表示されます。
LINQ to Entities はメソッド 'System.Linq.IQueryable`1[Entities.DomainModels.Category] getCategories()' メソッドを認識せず、このメソッドはストア式に変換できません。
参考までに、必要なデータは返されませんが、次のように動作します (基本的には結合です)。
var q = from p in Programs
from pc in p.Categories
join c in getCategories() on pc.categoryID equals c.id
select new
{
id = p.id,
category = c
};
エラーが概念的に何を意味するかは理解していますが、LINQ to SQL はそれを機能させます。データレイヤー全体にこのパターンがあり、それを維持したいと思っています。これは機能するはずですか?そうでない場合、レイヤーを混合せずに変更するにはどうすればよいですか。