查询包括修改的所有对象的好方法

时间:2012-08-25 11:14:59

标签: c# entity-framework iqueryable

我正在寻找一种很好的方法来收集对象上下文中的所有对象 - 包括添加和修改的对象。 我现在关于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(...)的部分。 你懂我的意思吗?然后,我想尝试针对从对象状态管理器传递的对象执行此部分查询。

你怎么看?这可能吗?你能帮助我实现这个目标吗?或者我是否会走向完全错误的方向?有更好的方法吗?

0 个答案:

没有答案