72

Вопрос по linq, entity-framework – LINQ to Entities не распознает метод 'System.String Format (System.String, System.Object, System.Object)'

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

private void GetReceivedInvoiceTasks(User user, List<Task> 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
                   };
}

Хотя есть проблемы. Я пытаюсь создать задачи. Для каждой новой задачи, когда я устанавливаю текст ссылки на постоянную строку, например & quot; Hello & quot; это нормально. Однако выше я пытаюсь построить свойство linktext, используя свойства счета.

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

base {System.SystemException} = {"LINQ to Entities does not recognize the method 'System.String Format(System.String, System.Object, System.Object)' method, and this method cannot be translated into a store expression."}

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

Да, пропустил это изначально

Apr 09, 2012, 9:21 PMот

возможный дубликат<a href="http://stackoverflow.com/questions/4121863/linq-to-entities-does-not-recognize-the-method-system-string-tostring-method">LINQ to Entities does not recognize the method &apos;System.String ToString()&apos; method</a>

Dec 12, 2013, 1:32 PMот

3ответа

132

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

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

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
                });
1

Error: User Rate Limit Exceededstring.FormatError: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

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 = "Invoice " + i.InvoiceNumber + "has been received from " + i.Organisation.Name),
                   Link = Views.Edit
               };

Error: User Rate Limit ExceededAsEnumerableError: User Rate Limit ExceededAsEnumerable хоть.

15

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

Так что в основном, когда вы говорите,IEnumerable.ToString(), C # получает сбор данных и звонкиToString()Error: User Rate Limit ExceededIQueryable.ToString() C # говорит SQL для вызоваToString()Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Error: User Rate Limit ExceededIQueryableError: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

IQueryable<Customer> 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")
                                                   });

RelatedQuestions