LINQ to Objects和LINQ to SQL查询之间的差异

时间:2009-11-11 21:25:34

标签: linq linq-to-sql linq-to-objects

我一直在使用LINQ来查询我的POCO对象一段时间,但我还没有尝试过LINQ to SQL。我假设LINQ to SQL查询以某种方式转换为等效的SQL查询,鉴于此,我想知道这是否会影响LINQ to SQL查询的编写方式。

LINQ to Objects和LINQ to SQL之间是否存在影响我应该如何编写查询的显着差异?

4 个答案:

答案 0 :(得分:3)

主要区别在于您说,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在让你编写经常只是做你期望的查询的查询方面做了出色的工作,但它无法做到。

答案 1 :(得分:2)

LINQ to SQL将使用列数据库服务器对WhereOrderBy的排序规则。 LINQ to Objects将使用字符串比较。因此前者可能不区分大小写,而后者则区分大小写。 LINQ to Entities合并空值。我认为L2S也是如此,但我还没有测试过。所以在L2E中你可以做到:

let foo = item.Property.SomeNullableType

...如果Property为null,则foo将为null。但是在LINQ to Objects中,您必须执行以下操作:

let foo = item.Property != null ? item.Property.SomeNullableType : null

...或者你得到一个空例外。

答案 2 :(得分:1)

MSDN参考herehere可以帮助您。

答案 3 :(得分:1)

我遇到的一个区别是分组的差异。

当你将linq分组到对象时,你会得到一个分层结构的结果(带有子对象的键)。

在SQL中进行分组时,只能获得密钥和聚合。

当你将linq分组为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)
  });