То, как я это делал в прошлом, - это скомпилировать приложение .Net как консольное приложение, а затем на сервере Linux создать скрипт запуска в каталоге initscripts.
Очевидно, что в Linux нет служб Windows, и демоны, которые запускаются из каталогов rc.d при запуске, являются его эквивалентами. Все, что делает большинство скриптов rc.d, - это запускает различные приложения в фоновом потоке, поэтому в этом нет ничего сложного. Единственная дополнительная работа заключается в том, что вам нужно написать сценарий оболочки Linux для запуска и, если вы хотите, остановить службу.
Причиной вашей ошибки является область действия, о которой вам сообщает ошибка «метод не поддерживается».
Обычно это происходит при использовании Linq для [заполнения пустого поля] ORM . Итак, я предполагаю, что ваши объекты должны быть из инструмента ORM, например Entity Framework, и вы используете что-то вроде Linq to Entities.
При использовании linq ваш запрос не перечисляется до тех пор, пока вы не получите к нему доступ, что для ORM означает попадание в базу данных или другое хранилище данных. Это отложенное действие может вызвать странное поведение, если вы не знаете, что оно там есть, например, эта ошибка.
Но у вас есть локальный (не-linq) код и ваш запрос переплетены, поэтому компилятор linq to [] не знать, как обрабатывать локальный код при компиляции кода linq. Таким образом, «метод не поддерживается» ошибка - это в основном то же самое, что ссылка на частный метод извне класса, метод, который вы вызвали, неизвестен в текущей области.
Другими словами, компилятор пытается скомпилировать ваш запрос и попадает в базу данных, когда вы это делаете result.ToString (), но ничего не знает о частной переменной CustomerNames или методе foreach. Логика базы данных и логика локального объекта должны храниться отдельно - полностью разрешите результаты запроса к базе данных перед использованием локально.
Вы должны иметь возможность записать это следующим образом:
var customerNames = entities.Customer.Select(c => c.CustomerName).ToList();
Если вам нужно сохранить foreach (подробнее сложная логика, не для этого простого примера) вам все равно нужно разрешить часть Linq to [] (заставив ее перечислить результаты запроса) до включения любого кода, отличного от linq:
var query = from c in entities.Customer
select c.CustomerName;
var qryList = query.ToList();
List<string> customerNames = new List<string>();
foreach (var result in qryList)
{
customerNames.Add(result.ToString());
}
Можете ли вы попробовать использовать только метод ToList ()
вместо foreach
?
List<string> customerNames = query.ToList();
Если проблема не в ToString ()
, поскольку Гарт упомянул , моя вторая подозрительная проблема относится к c.CustomerName
. Это настраиваемое свойство в частичном классе?
Кроме того, трассировка стека исключения должна явно показывать, какой метод не поддерживается.
попробуйте это
var query = from c in entities.Customer
select c.CustomerName;
List<string> customerNames = new List<string>();
query.ToList().ForEach(r=>customerNames.Add(r));
Попробуйте удалить .ToString ()
и посмотрите, сработает ли это:
foreach (var result in query)
{
customerNames.Add(result);
}
Похоже, что корень проблемы лежит глубоко внутри преобразования запросов LINQ-to-SQL механизм. Я полагаю, что механизм перевода пытается перевести .ToString ()
в SQL и терпит неудачу.