Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LINQ to对象和LINQ to SQL查询之间的差异_Linq_Linq To Sql_Linq To Objects - Fatal编程技术网

LINQ to对象和LINQ to SQL查询之间的差异

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查询我的POCO对象有一段时间了,但我还没有尝试使用LINQtoSQL。我假设LINQtoSQL查询以某种方式转换为等效的SQL查询,鉴于此,我想知道这是否会影响编写LINQtoSQL查询的方式


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还合并空值。另请参见