我需要IObjectSet<T>
的实现才能验证表达式作为“真正的”Linq2Entity提供程序。有可能吗?
背景:
我已经更改了我的EF模型(模型优先)以返回IObjectSet<T>
而不是ObjectSet<T>
为了我可以伪造我的模型,并让它返回我想要的数据。
问题:
我编写了IObejctSet<T>
的实现,它实际上是List<T>
的包装器
当我使用LinqToObject查询IObjectSet<T>
im的实现时,这一切都很好 - 但 - 因此无法保证我有有效的 Linq2Entity表达式。
建议的解决方案:
用真实的
在我的实现中,我只使用List<T>
的提供者:
private class IObjectSetUnitTestImplementation<T> : IObjectSet<T> where T : EntityObject
{
private IQueryable _qry;
public IObjectSetUnitTestImplementation(List<T> lst)
{
_inner = lst;
_qry = _inner.AsQueryable();
Expression = _qry.Expression;
ElementType = _qry.ElementType;
Provider = _qry.Provider; //<--should be ObjectSet<T>'s provider
}
//Rest of implementaion omitted
}
所以我尝试了这个:
ObjectContext context = null;
var _qry = new ObjectQuery<T>(typeof(T).Name, context) as IQueryable;
Expression = _qry.Expression;
ElementType = _qry.ElementType;
Provider = _qry.Provider;
但我没有上下文来提供它,即使我有,它只会尝试访问数据库。
还有其他办法吗?
答案 0 :(得分:1)
因此无法保证我有有效的Linq2Entity表达式&#34;
恭喜,您刚刚发现了一个原因,为IObjectSet<T>
实施IRepository<T>
,IQyeryable<T>
等原因。原因很简单:对一个LINQ提供程序有效的查询对另一个LINQ提供程序可能无效(即使您只是将数据库从MS SQL更改为其他提供者)。
并且没有通用的方法来验证这些查询
因此,单元测试不是IQyeryable<T>
的不错选择,但集成测试绝对是您需要的。