我正在寻找一种很好的方法来收集对象上下文中的所有对象 - 包括添加和修改的对象。 我现在关于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(...)的部分。 你懂我的意思吗?然后,我想尝试针对从对象状态管理器传递的对象执行此部分查询。
你怎么看?这可能吗?你能帮助我实现这个目标吗?或者我是否会走向完全错误的方向?有更好的方法吗?