如果我们将DataContext抽象出来,那么L2S和L2O查询是否相同?我已经有一个可以证明这一点的工作原型,但它非常简单,不知道是否能够应对更高级的查询。有人知道吗?
IEnumerable<T>
集合的。查询通过迭代集合并执行一系列方法(例如Contains
、Where
等)来处理集合中的项目。IQueryable<T>
集合的。编译器将查询转换为表达式树,然后将该表达式树翻译成SQL,并传递给数据库。var query = from n in names
orderby n.LastName.TrimStart(',', ' ').ToUpper(),
n.FirstName.TrimStart(',', ' ').ToUpper()
select new { n.FirstName, n.LastName };
(通常可以绕过这些限制,但事实上你不能保证任何任意的LINQ to Objects查询都能作为LINQ to SQL查询工作,这告诉我它们不是相同的!)
Where(pred).Single()
-但不支持Single(pred)
(这是LINQ-to-SQL的首选用法)因此,您无法真正使用IEnumerable来模拟数据库的单元测试,即使通过AsQueryable() - 它根本不够强大。出于这个原因,我个人将IQueryable和Expression远离存储库接口-请参见实用的LINQ。
因此,最终你必须针对数据库进行测试以确保正确性,但我认为 L2O 对于简单、快速的单元测试非常好用。