Я переношу кое-что с одного сервера mysql на сервер sql, но не могу понять, как заставить этот код работать:
using (var context = new Context())
{
...
foreach (var item in collection)
{
IQueryable<entity> pages = from p in context.pages
where p.Serial == item.Key.ToString()
select p;
foreach (var page in pages)
{
DataManager.AddPageToDocument(page, item.Value);
}
}
Console.WriteLine("Done!");
Console.Read();
}
Когда он входит во второй, foreach (var page in pages)
он выдает исключение, говорящее:
LINQ to Entities не распознает метод System.String ToString (), и этот метод нельзя преобразовать в выражение хранилища.
Кто-нибудь знает, почему это происходит?
Ответы:
Просто сохраните строку во временную переменную, а затем используйте ее в своем выражении:
Проблема возникает из-за того, что на
ToString()
самом деле не выполняется, она превращается в MethodGroup, а затем анализируется и транслируется в SQL. ПосколькуToString()
эквивалента нет , выражение неверно.Примечание:
Убедитесь, что вы также ознакомились с ответом Алекса относительно
SqlFunctions
вспомогательного класса, который был добавлен позже. Во многих случаях это может устранить необходимость во временной переменной.источник
ToString()
не один из них.ExecuteQuery
или с помощью Entity SQL сObjectQuery<T>
Как ответили другие, это ломается, потому что .ToString не может преобразовать в соответствующий SQL на пути в базу данных.
Однако Microsoft предоставляет класс SqlFunctions, который представляет собой набор методов, которые можно использовать в подобных ситуациях.
В этом случае вы ищете SqlFunctions.StringConvert :
Хорошо, когда решение с временными переменными по каким-либо причинам нежелательно.
Подобно SqlFunctions, у вас также есть EntityFunctions (при этом EF6 устарел DbFunctions ), который предоставляет другой набор функций, которые также не зависят от источника данных (не ограничиваются, например, SQL).
источник
Проблема в том, что вы вызываете ToString в запросе LINQ to Entities. Это означает, что синтаксический анализатор пытается преобразовать вызов ToString в его эквивалентный SQL (что невозможно ... отсюда и исключение).
Все, что вам нужно сделать, это переместить вызов ToString в отдельную строку:
источник
Была аналогичная проблема. Решил это, вызвав ToList () в коллекции сущностей и запросив список. Если коллекция небольшая, это вариант.
Надеюсь это поможет.
источник
Измените его так, и он должен работать:
Причина, по которой исключение не генерируется в строке, в которой объявлен запрос LINQ, а в строке,
foreach
является функция отложенного выполнения, т.е. запрос LINQ не выполняется, пока вы не попытаетесь получить доступ к результату. И это происходит в,foreach
а не раньше.источник
Приведите таблицу в
Enumerable
, затем вы вызываете методы LINQ с использованиемToString()
метода внутри:Но будьте осторожны при вызове методов
AsEnumerable
или,ToList
потому что перед этим методом вы запросите все данные от всех сущностей. В моем случае выше я прочитал всеtable_name
строки по одному запросу.источник
У меня сработало обновление до Entity Framework версии 6.2.0 .
Раньше у меня была версия 6.0.0.
Надеюсь это поможет,
источник
В MVC предположим, что вы ищете запись (записи) на основе ваших требований или информации. Он работает правильно.
источник
Если вы действительно хотите ввести
ToString
текст внутри своего запроса, вы можете написать посетителя дерева выражений, который перезаписывает вызовToString
с помощью вызова соответствующейStringConvert
функции :источник
First
здесь - для результатовGetMethods()
возвратаMethodInfo[]
. AFAIK,MethodInfo[]
не имеетFind
метода и такого метода расширения. Но мне действительно следует использовать,Single
потому что этот метод обнаруживается посредством отражения, и не будет ошибки времени компиляции, если соответствующий метод не может быть разрешен.В этом случае у меня такая же ошибка:
Потратив слишком много времени на отладку, я понял, что ошибка появилась в логическом выражении.
Первая строка
search.Contains(log.Id.ToString())
работает нормально, но последняя строка, посвященная объекту DateTime, вызвала ужасный сбой:Удалите проблемную строку и проблема решена.
Я не совсем понимаю, почему, но похоже, что ToString () - это выражение LINQ для строк, но не для сущностей. LINQ for Entities работает с такими запросами к базе данных, как SQL, а SQL не имеет понятия ToString (). Таким образом, мы не можем добавить ToString () в предложение .Where ().
Но как тогда работает первая строка? Вместо ToString () в SQL есть
CAST
иCONVERT
, поэтому я предполагаю, что linq для сущностей использует это в некоторых простых случаях. Объекты DateTime не всегда оказываются такими простыми ...источник
Просто превратите запрос LINQ to Entity в запрос LINQ to Objects (например, вызов ToArray) в любое время, когда вам понадобится использовать вызов метода в запросе LINQ.
источник