LINQ to Entities не распознает метод ‘System.String Format (System.String, System.Object, System.Object)’

У меня есть этот запрос linq:

private void GetReceivedInvoiceTasks(User user, List tasks) { var areaIds = user.Areas.Select(x => x.AreaId).ToArray(); var taskList = from i in _db.Invoices join a in _db.Areas on i.AreaId equals a.AreaId where i.Status == InvoiceStatuses.Received && areaIds.Contains(a.AreaId) select new Task { LinkText = string.Format(Invoice {0} has been received from {1}, i.InvoiceNumber, i.Organisation.Name), Link = Views.Edit }; } 

Однако у него есть проблемы. Я пытаюсь создать задачи. Для каждой новой задачи, когда я устанавливаю текст ссылки на константную строку типа «Привет», это нормально. Однако выше я пытаюсь создать свойство linktext, используя свойства счета-фактуры.

Я получаю эту ошибку:

base {System.SystemException} = {«LINQ to Entities не распознает метод« System.String Format (System.String, System.Object, System.Object) », и этот метод не может быть переведен в выражение хранилища». }

Кто-нибудь знает, почему? Кто-нибудь знает альтернативный способ сделать это, чтобы заставить его работать?

Entity Framework пытается выполнить вашу проекцию на стороне SQL, где нет эквивалента string.Format . Используйте AsEnumerable() для принудительной оценки этой части с помощью Linq для объектов.

Основываясь на предыдущем ответе, который я вам дал, я бы реструктурировал ваш запрос следующим образом:

 int statusReceived = (int)InvoiceStatuses.Received; var areaIds = user.Areas.Select(x=> x.AreaId).ToArray(); var taskList = (from i in _db.Invoices where i.Status == statusReceived && areaIds.Contains(i.AreaId) select i) .AsEnumerable() .Select( x => new Task() { LinkText = string.Format("Invoice {0} has been received from {1}", x.InvoiceNumber, x.Organisation.Name), Link = Views.Edit }); 

Также я вижу, что вы используете связанные объекты в запросе ( Organisation.Name ), убедитесь, что вы добавили надлежащее Include к вашему запросу или, в частности, внесите материализацию этих свойств для последующего использования, то есть:

 var taskList = (from i in _db.Invoices where i.Status == statusReceived && areaIds.Contains(i.AreaId) select new { i.InvoiceNumber, OrganisationName = i.Organisation.Name}) .AsEnumerable() .Select( x => new Task() { LinkText = string.Format("Invoice {0} has been received from {1}", x.InvoiceNumber, x.OrganisationName), Link = Views.Edit }); 

IQueriable проистекает из IEnumerable, основное сходство в том, что когда вы делаете свой запрос, он отправляется в механизм базы данных на своем языке, тонкий момент – это то, где вы указываете C # обрабатывать данные на сервере (а не на стороне клиента) или сообщать SQL для обработки данных.

Таким образом, в основном, когда вы говорите, что IEnumerable.ToString (), C # получает сбор данных и вызывает ToString () на объекте. Но когда вы говорите, что IQueriable.ToString () C # говорит SQL вызывать ToString () для объекта, но такого метода в SQL не существует.

Недостатком является то, что когда вы обрабатываете данные на C #, вся коллекция, которую вы ищете, должна быть создана в памяти до того, как C # применит фильтры.

Самый эффективный способ сделать это – сделать запрос как IQueriable со всеми фильтрами, которые вы можете применить.

А затем создайте его в памяти и сделайте форматирование данных на C #.

 IQueryable dataQuery = Customers.Where(c => c.ID < 100 && c.ZIP == 12345 && c.Name == "John Doe"); var inMemCollection = dataQuery.AsEnumerable().Select(c => new { c.ID c.Name, c.ZIP, c.DateRegisterred.ToString("dd,MMM,yyyy") }); 
  • Entity Framework 4 Single () vs First () vs FirstOrDefault ()
  • ASP.NET MVC 2.0 Реализация поиска в jqgrid
  • Entity Framework 4 / POCO - С чего начать?
  • Как получить первую запись в каждой группе с помощью Linq
  • В чем разница между .ToList (), .AsEnumerable (), AsQueryable ()?
  • Указанный член типа «Дата» не поддерживается в LINQ to Exities Exception
  • Тип узла выражения LINQ «ArrayIndex» не поддерживается в LINQ to Entities
  • Linq int to string
  • большая проблема в преобразовании строки в datetime с использованием linq-to-entity
  • Как сделать массовую вставку - Linq для объектов
  • Тип одного из выражений в предложении соединения неверен в Entity Framework
  • Interesting Posts

    Исполняемый файл драйвера должен быть установлен с помощью свойства webdriver.ie.driver

    x86_64 регистры rax / eax / ax / al, переписывающие содержимое полного регистра

    Как передать функцию-член, где ожидается функция free?

    Назначьте переменную внутри блока переменной переменной вне блока

    Вложенные правила @media в CSS

    Как определить, какой тип Wi-Fi поддерживается вашим драйвером в Linux

    Ведение целой таблицы на одной странице

    Regex, чтобы проверить, содержит ли строка только числа

    Транспортир Угловой 2 Ошибка: неизвестная ошибка: угловая не определена

    Правильно ли это утверждение? Метод HTTP GET всегда не имеет тела сообщения

    Что такое спецификатор формата printf для bool?

    Получить изображение профиля пользователя по идентификатору

    Запретить исходящий трафик, если соединение OpenVPN не активно, используя pf.conf в Mac OS X

    пользовательский шрифт в android ListView

    В чем разница между Apache Spark и Apache Flink?

    Давайте будем гением компьютера.