Dun*_*can 6 linq-to-objects linq-to-sql
如果我们抽象出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 };
Run Code Online (Sandbox Code Playgroud)
(通常可以解决这些限制,但事实上你不能保证任何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非常适合简单,快速的单元测试.
| 归档时间: |
|
| 查看次数: |
3652 次 |
| 最近记录: |