0

編集された投稿

これは可能でしょうか?

プリコンパイルされたクエリ式がある

すなわち

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 は非静的メソッドを持つ静的フィールドを推奨しています。

どんな助けでもいただければ幸いです

4

1 に答える 1

0

いくつかの構文の奇妙な点 (クエリ式では のwhere代わりでありWhere、なぜ が得られたのかわかりません[Id]) を除けば、それで問題ないと思います。確かに、コンパイルされたクエリの経験はあまりありませんが、試してみる価値は間違いありません。結局のところ、LINQ はコンポーザブルになるように設計されています。

試してみましたか?問題がある場合は、質問に編集してください。問題に対処できるようになります。

編集:「これは同じクラス内で定義されている場合は機能しますが、外部で定義されている場合は機能しません」に応答すると、同じクラスにあるかのようにまだ呼び出そうとしているように聞こえます。これはメソッドです。他のメソッドを呼び出すのと同じように呼び出します。静的メソッドの場合は型名を使用し、それ以外の場合は参照を使用します。

于 2009-11-28T13:46:23.610 に答える