LINQ to对象和LINQ to SQL查询之间的差异
我已经使用LINQ查询我的POCO对象有一段时间了,但我还没有尝试使用LINQtoSQL。我假设LINQtoSQL查询以某种方式转换为等效的SQL查询,鉴于此,我想知道这是否会影响编写LINQtoSQL查询的方式LINQ to对象和LINQ to SQL查询之间的差异,linq,linq-to-sql,linq-to-objects,Linq,Linq To Sql,Linq To Objects,我已经使用LINQ查询我的POCO对象有一段时间了,但我还没有尝试使用LINQtoSQL。我假设LINQtoSQL查询以某种方式转换为等效的SQL查询,鉴于此,我想知道这是否会影响编写LINQtoSQL查询的方式 LINQ to Objects和LINQ to SQL之间是否存在影响我应该如何为它们编写查询的显著差异?LINQ to SQL将使用列DB server的排序规则,用于Where和OrderBy。LINQ to对象将使用字符串比较。因此,前者可能不区分大小写,而后者则区分大小写。LI
LINQ to Objects和LINQ to SQL之间是否存在影响我应该如何为它们编写查询的显著差异?LINQ to SQL将使用列DB server的排序规则,用于
Where
和OrderBy
。LINQ to对象将使用字符串比较。因此,前者可能不区分大小写,而后者则区分大小写。LINQ到实体合并空值。我想L2S也是这样,但我还没有测试过。因此,在L2E中,您可以执行以下操作:
let foo = item.Property.SomeNullableType
。。。如果属性为null,foo
将为null。但在LINQ to对象中,您必须执行以下操作:
let foo = item.Property != null ? item.Property.SomeNullableType : null
。。。或者您会得到一个空异常。主要区别在于,正如您所说,LINQ到SQL查询被转换为SQL。这意味着您可以编写一些代码,这些代码实际上是不可转换的,或者具有一些微妙的不同语义,您只能在执行时才能发现 例如:
var query = from person in people
where person.Age == person.GetHashCode()
select person;
将很好地编译,但在执行时失败,因为linqtosql不知道如何处理GetHashCode()
基本上,我发现LINQtoSQL比LINQtoObject更难预测。这并不是说它没有用处——这只是一个稍微不同的世界。MS在让您编写查询方面做了一项惊人的工作,这些查询通常只是做您希望它们做的事情,但它不能做所有事情。MSDN参考,应该可以帮助您解决问题。我遇到的一个差异是分组方面的差异 在linq to对象中分组时,将得到一个层次结构形状的结果(关键帧和子对象) 当您在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)
});
是的,LinqToSql还合并空值。另请参见