Различия между LINQ к Объектам и LINQ к SQL-запросам

Сделать это в Python (т.е. не переносящийся scp посредством подпроцесса. Popen или подобный) с библиотека Paramiko , Вы сделали бы что-то вроде этого:

import os
import paramiko

ssh = paramiko.SSHClient() 
ssh.load_host_keys(os.path.expanduser(os.path.join("~", ".ssh", "known_hosts")))
ssh.connect(server, username=username, password=password)
sftp = ssh.open_sftp()
sftp.put(localpath, remotepath)
sftp.close()
ssh.close()

(Вы, вероятно, хотели бы иметь дело с неизвестными хостами, ошибками, создавая любые необходимые каталоги, и так далее).

5
задан GraemeF 11 November 2009 в 21:25
поделиться

4 ответа

Основное отличие, как вы говорите, в том, что запросы 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 проделала потрясающую работу, позволив вам писать запросы, которые очень часто просто делают то, что вы от них ожидаете, но не может делать все.

3
ответ дан 14 December 2019 в 08:53
поделиться

LINQ to SQL будет использовать параметры сортировки сервера БД столбца для , где и OrderBy . LINQ to Objects будет использовать сравнения строк. Таким образом, первое может быть без учета регистра, а второе - с учетом регистра. LINQ to Entities объединяет нули. Я предполагаю, что L2S делает то же самое, но я не тестировал. Итак, в L2E вы можете сделать:

let foo = item.Property.SomeNullableType

... и foo будут иметь значение null, если свойство Property равно null. Но в LINQ to Objects вам нужно будет сделать что-то вроде:

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

... или вы получите нулевое исключение.

2
ответ дан 14 December 2019 в 08:53
поделиться

Ссылка MSDN здесь и здесь должна вам помочь.

1
ответ дан 14 December 2019 в 08:53
поделиться

Одно различие, с которым я столкнулся, - это различия в группировке.

Когда вы группируете в linq по объектам, вы получаете результат иерархической формы (ключи с дочерними объектами).

Когда вы группируете в 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
ответ дан 14 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: