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