这个问题不是关于如何测试数据访问,也不是关于存储库。这是关于我想在项目中使用我的 POCO 类(我用 TDD 制作的)时遇到的问题。我的意思是,这是由于 Linq to Entities 限制的问题(或者可能是我关于类设计的问题)。
我通过 TDD 学习的课程是下一个(当然,非常简化):
public class Person{
public int IdPerson{ get; set; }
public string Name { get; set; }
public int Average { get; set; }
}
public class Course{
public int IdCourse { get; set;}
public Person Professor { get; set;}
public IEnumerable<Person> Staff { get; set;}
public IEnumerable<Person> Students { get; set;}
public IEnumerable<Person> GetGreatStudents(){
return Students.Where(n => n.Average > 8);
}
}
很简单,对吧?
那么……那有什么问题呢?让我们看看......当我想从数据库中检索课程中的所有数据(课程类在现实模型中有很多子集合)对它们应用过滤器时,我能做到的唯一方法是这样的:
var course = from obj in Courses //Doesn't matter how i get the courses' collection
select {
IdCourse = obj.IdCourse,
GreatStudents = obj.GetGreatStudents(), // Here is the problem
OtherCollection = obj.OtherCollection.Where(n => n.Active).Select(n => n.Property1)
}
如您所知,由于GetGreatStudents()函数,它会返回错误:
LINQ to Entities 无法识别方法 [...] 此方法无法转换为存储表达式。
我的意思是,我知道我可以直接用.Where(n => n.Average > 8)替换该方法,但它很糟糕(实际上有很多过滤器),这样,有什么意义如果我不能使用我已经构建和测试过的 api,使用 TDD?
所以,我的问题是,对于那些有 TDD 和实体框架开发经验的人,当你使用 Linq to Entities 时,如何才能使用你通过 TDD 设计的漂亮 API?