編集された投稿
これは可能でしょうか?
プリコンパイルされたクエリ式がある
すなわち
private static Func<SmwrDataContext, int, IQueryable<Xyz>> _validXyzs =
CompiledQuery.Compile((Context context, int Id) =>
from xyz in _db.XYZs
join abc in _db.ABCs on xyz.Id equals abc.Id
where xyz.TypeId = id && xyz.Flag && abc.Flag
select xyz);
私は当初、同じリポジトリ内でこれを直接アクセスしていると宣言していましたが、問題なく使用できました。
public List<MyItem> GetItemsForValueRange(int xyzTypeId, double floor, double ceiling)
{
return (from xyx from _validXyzs (_db, xyzTypeId)
join num from _db.numbers xyz.ID equals num.lettersId
where
num.Value >= floor && num.Value <= ceiling
num.Flag
select new {
Name = xyz.Name,
Value = num.Value
}).ToList();
}
同じクエリが複数のリポジトリによって消費されていたため、後で静的変数を別のクラスにリファクタリングしました。
リファクタリング後の宣言は次のとおりです (_filteredXyzs) は、メソッドと同じクラスに存在し、それを消費できるようにします。
Public static IQueryable<Xyz> GetValidXyzs(Context context, int xyzTypeId)
{
return from _filteredXyzs(context, id);
}
特定のクエリ コンテキスト内で [RepositoryName].GetValidXyzs としてポスト リファクタリングを使用していましたが、次の「System.Data.Linq.dll で System.StackOverflowException' が発生しました」という結果になります。
Xyz エンティティはトップに基づいており、その可用性はマスター テーブル内の他のタイプのフラグによって決定されます。
Xyz は多くの場所で使用されているため、クエリをプリコンパイルしてパフォーマンスを向上させました。この側面を一元化して、メンテナンスをより簡単にしたかっただけです。
デバッガーをステップ実行すると、静的メソッドはエラーなしで終了しますが、次のステップ、つまり参加と評価で失敗します。だから私はこれを解決する方法に少し困惑していますか?
c# と Linq に関する私の知識は限られているため、タイプミスやその他の誤った推論については申し訳ありません。
Ps: 余談ですが、Linq2Action は非静的メソッドを持つ静的フィールドを推奨しています。
どんな助けでもいただければ幸いです