0

我需要我的实现IObjectSet<T>能够像“真正的”Linq2Entity 提供者那样验证表达式。是否可以?

背景
我已将我的 EF 模型(模型优先)更改为 returnIObjectSet<T>而不是ObjectSet<T>
这样我就可以伪造我的模型,并让它返回我想要的数据。

问题
我已经编写了一个实现,IObejctSet<T>它实际上是一个List<T>.
这一切都很好 -但是当我IObjectSet<T>使用 LinqToObject 查询我的 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;

但是我没有上下文可以提供它,即使我有,它也会尝试访问数据库。

还有其他方法吗?

4

1 回答 1

1

所以不能保证我有有效的 Linq2Entity 表达式”

恭喜,您刚刚发现了IObjectSet<T>IRepository<T>应该为IQyeryable<T>. 原因很简单:对一个 LINQ 提供程序有效的查询可能对另一个无效(即使您只是将数据库从 MS SQL 更改为其他数据库)。

并且没有通用的方法来验证这些查询。
所以,单元测试不是一个好的选择IQyeryable<T>,但是集成测试绝对是你需要的东西。

于 2013-10-11T09:40:44.420 回答