我已经使用LINQ查询我的POCO对象有一段时间了,但我还没有尝试过LINQ to SQL。我假设LINQ to SQL查询会以某种方式转换为等效的SQL查询,鉴于此,我想知道这是否影响了LINQ to SQL查询的编写方式。
LINQ to Objects和LINQ to SQL之间有什么重大差异,这会影响我如何编写任一查询吗?
我已经使用LINQ查询我的POCO对象有一段时间了,但我还没有尝试过LINQ to SQL。我假设LINQ to SQL查询会以某种方式转换为等效的SQL查询,鉴于此,我想知道这是否影响了LINQ to SQL查询的编写方式。
LINQ to Objects和LINQ to SQL之间有什么重大差异,这会影响我如何编写任一查询吗?
var query = from person in people
where person.Age == person.GetHashCode()
select person;
这段代码可以被编译,但在执行时会失败,因为LINQ to SQL不知道如何处理GetHashCode()
。
基本上我发现与LINQ to Objects相比,LINQ to SQL更难预测。这并不是说它没有用处 - 它只是一个稍微不同的世界。微软在让你编写查询方面做得非常出色,这些查询很多时候都能按照你的期望运行,但它不能做到所有事情。
LINQ to SQL将使用列DB服务器的排序规则进行Where
和OrderBy
。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
...否则你将会得到一个空异常。
我遇到的一个不同之处是分组方面的差异。
当您在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)
});