LINQ to Objects和LINQ to SQL查询的区别

5

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

LINQ to Objects和LINQ to SQL之间有什么重大差异,这会影响我如何编写任一查询吗?


不区分大小写的字符串比较在LINQ to SQL和LINQ to Objects中的实现。 - Ian Ringrose
4个回答

3
主要的区别就像你所说的,LINQ to SQL查询被转换为SQL语句。这意味着你可以编写一些代码,但实际上无法转换或具有某些微妙的不同语义-这只能在执行时发现。
例如:
var query = from person in people
            where person.Age == person.GetHashCode()
            select person;

这段代码可以被编译,但在执行时会失败,因为LINQ to SQL不知道如何处理GetHashCode()

基本上我发现与LINQ to Objects相比,LINQ to SQL更难预测。这并不是说它没有用处 - 它只是一个稍微不同的世界。微软在让你编写查询方面做得非常出色,这些查询很多时候都能按照你的期望运行,但它不能做到所有事情。


2

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

let foo = item.Property.SomeNullableType

如果Property为空,则foo将为null。但在LINQ to Objects中,您需要执行以下操作:

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

...否则你将会得到一个空异常。


1
是的,LinqToSql也合并空值。 - Amy B

1

我遇到的一个不同之处是分组方面的差异。

当您在Linq to Objects中进行分组时,您会得到一个层次结构形状的结果(键和子对象)。

当您在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)
  });

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接