【问题标题】:Differences between LINQ to Objects and LINQ to SQL queriesLINQ to Objects 和 LINQ to SQL 查询之间的区别
【发布时间】:2009-11-11 21:25:33
【问题描述】:
我一直在使用 LINQ 查询我的 POCO 对象,但我还没有尝试过 LINQ to SQL。我假设 LINQ to SQL 查询以某种方式转换为等效的 SQL 查询,鉴于此,我想知道这是否会影响或应该编写 LINQ to SQL 查询的方式。
LINQ to Objects 和 LINQ to SQL 之间是否有任何显着差异会影响我应该如何编写查询?
【问题讨论】:
标签:
linq
linq-to-sql
linq-to-objects
【解决方案1】:
主要区别在于,正如您所说,LINQ to SQL 查询被转换为 SQL。这意味着您可以编写的代码实际上是不可转换的或具有一些微妙不同的语义 - 您只能在执行时发现。
例如:
var query = from person in people
where person.Age == person.GetHashCode()
select person;
会编译正常,但在执行时会失败,因为 LINQ to SQL 不知道如何处理 GetHashCode()。
基本上,我发现 LINQ to SQL 比 LINQ to Objects 更难预测。这并不是说它没有用——它只是一个稍微不同的世界。 MS 在让您编写查询方面做得非常出色,经常只是按照您的期望去做,但它不能做所有事情。
【解决方案2】:
LINQ to SQL 将使用列 DB 服务器对 Where 和 OrderBy 的排序规则。 LINQ to Objects 将使用字符串比较。所以前者可能不区分大小写,而后者可能区分大小写。 LINQ to Entities 合并空值。我认为 L2S 也是如此,但我还没有测试过。所以在 L2E 中你可以这样做:
let foo = item.Property.SomeNullableType
... 如果 Property 为空,foo 将为空。但在 LINQ to Objects 中,您必须执行以下操作:
let foo = item.Property != null ? item.Property.SomeNullableType : null
...否则你会得到一个空异常。
【解决方案4】:
我遇到的一个差异是分组的差异。
当您在 linq 中对对象进行分组时,您会得到一个分层形状的结果(键,带有子对象)。
当您在 SQL 中分组时,您只能获得键和聚合。
当您在 linq to sql 中分组时,如果您要求子对象(超过聚合),linq to sql 将使用键重新查询每个组以获取这些子对象。如果您有数千个组,则可能是数千次往返。
//this is ok
var results = db.Orders
.GroupBy( o => o.CustomerID )
.Select(g => new
{
CustomerId = g.Key,
OrderCount = g.Count()
});
//this could be a lot of round trips.
var results = db.Orders
.GroupBy( o => o.CustomerID )
.Select(g => new
{
CustomerId = g.Key,
OrderIds = g.Select(o => o.OrderId)
});
// this is ok
// used ToList to separate linqtosql work from linqtoObject work
var results = db.Orders
.Select(o => new {o.CustomerId, o.OrderId})
.ToList()
.GroupBy(o => o.CustomerId)
.Select(g => new
{
CustomerId = g.Key,
OrderIds = g.Select(o => o.OrderId)
});