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") }); 
  • Преобразование String в Int в EF 4.0
  • LINQ to Entities не распознает метод
  • Сколько Include я могу использовать в ObjectSet в EntityFramework для сохранения производительности?
  • Включить внуков в EF Query
  • Возможна ли инъекция через динамический LINQ?
  • Указанный член типа «Дата» не поддерживается в LINQ to Exities Exception
  • Метод не может быть переведен в выражение хранилища
  • большая проблема в преобразовании строки в datetime с использованием linq-to-entity
  • Тип одного из выражений в предложении соединения неверен в Entity Framework
  • Как выполнить сравнение даты в запросе EF?
  • Тип узла выражения LINQ «ArrayIndex» не поддерживается в LINQ to Entities
  • Давайте будем гением компьютера.