1

追加および変更されたものを含め、オブジェクトコンテキストからすべてのオブジェクトを収集するための便利で快適な方法を探しています。これで、ObjectStateManagerについて説明し、オブジェクトを取得できるようになりました。しかし、私の問題は、linqを使用してオブジェクトコンテキストをクエリする場合、変更および追加されたオブジェクトに対して同じクエリを実行し、それらをマージする必要があることです。これは本当に快適ではなく、常に数行のコードです。これをうまく包む方法はありますか?

私はこのようなことを試みました:

new QueryWrapper<User>(ctx.Users).Where(u => u.Name.StartsWith("A"));

次に、独自のIQueryableと独自のIQueryProviderを実装して、これらをまとめて、実行される式ツリーを取得しようとしました。次に、この式ツリーを取得して、エンティティフレームワークと、変更および追加されたオブジェクトを取得するメモリ内コレクションに対して実行することを考えました。私はかなり遠くに来ました、ここに行きます:

public class InMemoryQuery<T> : IQueryable<T> 
{

    private readonly IQueryable<T> _queryable;

    public InMemoryQuery(IQueryable<T> queryable)
    {
        _queryable = queryable;
    }

    public IEnumerator<T> GetEnumerator()
    {
        return this._queryable.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        throw new NotImplementedException();
    }

    public Expression Expression
    {
        get { return this._queryable.Expression; }
    }

    public Type ElementType
    {
        get { return typeof(T); }
    }

    public IQueryProvider Provider
    {
        get
        {
            return new InMemoryQueryProvider(this._queryable.Provider);
        }
    }
}

そして、これが私のクエリプロバイダーです

public class InMemoryQueryProvider : IQueryProvider
    {

    private readonly IQueryProvider _innerprovider;

    public InMemoryQueryProvider(IQueryProvider innerprovider)
    {
        _innerprovider = innerprovider;
    }

    public IQueryable CreateQuery(Expression expression)
    {
        throw new System.NotImplementedException();
    }

    public IQueryable<TElement> CreateQuery<TElement>(Expression expression)
    {
        return new InMemoryQuery<TElement>(this._innerprovider.CreateQuery<TElement>(expression));
    }

    public object Execute(Expression expression)
    {
        throw new System.NotImplementedException();
    }

    public TResult Execute<TResult>(Expression expression)
    {
        throw new NotImplementedException();
    }
}

これはこれまでのところ機能しており、InMemoryQuery.GetEnumeratorメソッドで実行する必要のある式ツリーを取得できます。素晴らしい!私の問題は、このクエリに次のようなエンティティフレームワークの基本式も含まれていることです。

Convert(value(ObjectSet`1[EFQueryProviderTest.tbl_Contact]))
    .MergeAs(AppendOnly).Where(n => n.Name.StartsWith("A"))

しかし、私は.Where(...)以降の部分だけが必要です。分かりますか?次に、オブジェクト状態マネージャーから配信されたオブジェクトに対して、クエリのこの部分を実行してみます。

どう思いますか?これは可能ですか?これを達成するのを手伝ってもらえますか?それとも私は完全に間違った方向に進んでいますか?もっと良い方法はありますか?

4

0 に答える 0