Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将Linq2Object验证为Linq2Entity查询?_C#_Unit Testing_Entity Framework 4.1 - Fatal编程技术网

C# 如何将Linq2Object验证为Linq2Entity查询?

C# 如何将Linq2Object验证为Linq2Entity查询?,c#,unit-testing,entity-framework-4.1,C#,Unit Testing,Entity Framework 4.1,我需要我的IObjectSet实现能够像“真正的”Linq2Entity提供者那样验证表达式。可能吗 背景: 我已将EF模型(模型优先)更改为返回IObjectSet,而不是ObjectSet,这样我可以伪造模型,并让它返回我想要的数据 问题: 我已经编写了一个IObejctSet的实现,它实际上是列表的包装器 这一切都很好-但是当我使用LinqToObject查询我的IObjectSetim实现时-无法保证我有有效的Linq2Entity表达式 建议的解决方案: 使用真实的 在我的实现中,我只

我需要我的
IObjectSet
实现能够像“真正的”Linq2Entity提供者那样验证表达式。可能吗

背景
我已将EF模型(模型优先)更改为返回
IObjectSet
,而不是
ObjectSet

,这样我可以伪造模型,并让它返回我想要的数据

问题
我已经编写了一个
IObejctSet
的实现,它实际上是
列表的包装器

这一切都很好-但是当我使用LinqToObject查询我的
IObjectSet
im实现时-无法保证我有有效的Linq2Entity表达式

建议的解决方案
使用真实的 在我的实现中,我只使用
列表
的提供程序:

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
}
私有类IObjectSetUnitTestImplementation:IObjectSet其中T:EntityObject
{
私人保险公司;
公共IObjectSetUnitTestImplementation(列表lst)
{
_内=lst;
_qry=_inner.AsQueryable();
表达式=_qry.Expression;
ElementType=\u qry.ElementType;
Provider=\u qry.Provider//
所以不能保证我有有效的LINQ2实体表达式“

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

没有通用的方法来验证这些查询。

因此,单元测试对于
IQyeryable
来说不是一个好的选择,但是集成测试绝对是一个你需要的东西。

我以前有过这个论点,但我希望有人能找到解决方案。我只是不明白为什么不能possible@JensKloster:这是不可能的,因为LINQ提供程序的性质。第一个provider支持功能
A
,第二个-不支持。要使用此功能验证表达式,您需要通过LINQ提供程序从中生成查询,而查询构造意味着“查询执行”“.我对你的答案投了赞成票,因为我越深入地研究这个问题,你的答案就越有意义:)仍然希望有人能想出一个解决办法。.我不知道,你说得对:)谢谢
ObjectContext context = null;
var _qry = new ObjectQuery<T>(typeof(T).Name, context) as IQueryable;
Expression = _qry.Expression;
ElementType = _qry.ElementType;
Provider = _qry.Provider;