4

このコンパイル済みの linq-to-sql クエリを考えてみましょう。

private static Func<LINQDBDataContext, string, IQueryable<Pet>> 
    QueryFindByName =
    CompiledQuery.Compile((
    MyLinqDataContext context, string name) =>
    from p in context.Pets where p.Name == name select p);

しかし、私はすでにクラス内のコンテキストへのプライベート参照を保持しており、コンテキストを公開せずにクエリをパブリックとしてマークできるようにしたい.

private static MyLinqDataContext context = SomeUtilityClass.GetMeMyContext();
//...
public static Func<string, IQueryable<Pet>> QueryFindByName = 
    CompiledQuery.Compile((string name) =>
    from p in this.context.Pets where p.Name == name select p); 
    //doesn't compile as expects TArg0 to be a DataContext.

クエリごとにパブリック ラッパー関数を作成せずにこれを行う方法はありますか??

4

1 に答える 1

3

コンテキストへの参照は静的ですか。つまり、型全体で単一のコンテキストを持っていますか? それは私には素晴らしいアイデアのようには聞こえません。とにかく、それを脇に置いて、次のことができます:

// Private version which takes a context...
private static Func<LINQDBDataContext, string, IQueryable<Pet>> 
    QueryFindByNameImpl =
    CompiledQuery.Compile((
    LINQDBDataContext context, string name) =>
    from p in context.Pets where p.Name == name select p);

// Public version which calls the private one, passing in the known context
public static Func<string, IQueryable<Pet>> QueryFindByName = 
    name => QueryFindByNameImpl(contextFromType, name);

編集:わかりました、このアプローチが気に入らない場合は、CompiledQuery.Compile代わりに独自の汎用ラッパーを作成してみてください。例えば:

public static class LinqHelpers
{
    public static Func<TArg0, TResult> Compile<TContext, TArg0, TResult>
        (this TContext context, 
         Expression<Func<TContext, TArg0, TResult>> query)
        where TContext : DataContext
    {
        Func<TContext, TArg0, TResult> compiled = 
            CompiledQuery.Compile(query);
        return arg => compiled(context, arg);
    }
}

(その他のパラメータについても同様です。)

私はそれをコンパイルしようとさえしていませんが、うまくいくと思います。次に、次のように使用します。

private static MyLinqDataContext context = SomeUtilityClass.GetMeMyContext();

public static Func<string, IQueryable<Pet>> QueryFindByName = context.Compile
    ((LINQDBDataContext context, string name) =>
      from p in context.Pets where p.Name == name select p);

もちろん、まだラッパーを作成していますが、少なくとも 1 か所で行うだけで済みます。ラッパーを作成することに対する異議が、退屈/コードの混乱以外のものである場合は、詳細を教えてください。

于 2009-02-18T16:42:42.093 に答える