如果我们抽象出 DataContext,那么 L2S 和 L2O 查询是否相同?
我已经有一个可以证明这一点的工作原型,但它非常简单,想知道它是否能支持更高级的查询。
有人知道吗?
如果我们抽象出 DataContext,那么 L2S 和 L2O 查询是否相同?
我已经有一个可以证明这一点的工作原型,但它非常简单,想知道它是否能支持更高级的查询。
有人知道吗?
不,他们不一样。
LINQ to Objects 查询对IEnumerable<T>
集合进行操作。查询遍历集合并针对集合中的项目执行一系列方法(例如,Contains
等Where
)。
LINQ to SQL 查询对IQueryable<T>
集合进行操作。编译器将查询转换为表达式树,然后将该表达式树转换为 SQL 并传递给数据库。
LINQ to SQL 抱怨无法将方法转换为 SQL 是很常见的,即使该方法在 LINQ to Objects 查询中完美运行。(在其他情况下,您可能看不到异常,但查询结果在 LINQ to Objects 和 LINQ to SQL 之间可能略有不同。)
例如,LINQ to SQL 会阻塞这个简单的查询,而 LINQ to Objects 会很好:
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 查询工作这一事实告诉我,它们并不相同!)
令人沮丧IQueryably<T>
的是,所有的实现本质上都是有漏洞的抽象——假设在 LINQ-to-Objects 中工作的东西在任何其他提供者下仍然可以工作是不安全的。除了明显的函数映射之外,还有以下内容:
Where(pred).Single()
- 但不支持Single(pred)
(这是LINQ-to-SQL 的首选用法)所以你不能真正使用IEnumerable<T>
模拟数据库的单元测试,即使通过AsQueryable()
- 它根本不健壮。就个人而言,出于这个原因,我IQueryable<T>
远离Expression
存储库接口 - 请参阅Pragmatic LINQ。
查询语法相同。如果你使用 Enumerable.ToQuerable,即使类型是一样的。但是有一些区别:
所以最后,你必须对数据库进行测试才能确定,但我认为 L2O 非常适合简单、快速的单元测试。