foreach в результате linq, не работающем

То, как я это делал в прошлом, - это скомпилировать приложение .Net как консольное приложение, а затем на сервере Linux создать скрипт запуска в каталоге initscripts.

Очевидно, что в Linux нет служб Windows, и демоны, которые запускаются из каталогов rc.d при запуске, являются его эквивалентами. Все, что делает большинство скриптов rc.d, - это запускает различные приложения в фоновом потоке, поэтому в этом нет ничего сложного. Единственная дополнительная работа заключается в том, что вам нужно написать сценарий оболочки Linux для запуска и, если вы хотите, остановить службу.

5
задан Shahedur Rahman 12 October 2009 в 17:45
поделиться

5 ответов

Причиной вашей ошибки является область действия, о которой вам сообщает ошибка «метод не поддерживается».

Обычно это происходит при использовании 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());  
}
5
ответ дан 14 December 2019 в 04:42
поделиться

Можете ли вы попробовать использовать только метод ToList () вместо foreach ?

List<string> customerNames = query.ToList();
2
ответ дан 14 December 2019 в 04:42
поделиться

Если проблема не в ToString () , поскольку Гарт упомянул , моя вторая подозрительная проблема относится к c.CustomerName . Это настраиваемое свойство в частичном классе?

Кроме того, трассировка стека исключения должна явно показывать, какой метод не поддерживается.

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

попробуйте это

var query = from c in entities.Customer
        select c.CustomerName;

List<string> customerNames = new List<string>();

query.ToList().ForEach(r=>customerNames.Add(r));
0
ответ дан 14 December 2019 в 04:42
поделиться

Попробуйте удалить .ToString () и посмотрите, сработает ли это:

foreach (var result in query)
{
    customerNames.Add(result);  
}

Похоже, что корень проблемы лежит глубоко внутри преобразования запросов LINQ-to-SQL механизм. Я полагаю, что механизм перевода пытается перевести .ToString () в SQL и терпит неудачу.

0
ответ дан 14 December 2019 в 04:42
поделиться
Другие вопросы по тегам:

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