Ошибка Linq to Entities при использовании модели представления в списке выбора - PullRequest
0 голосов
/ 05 октября 2011

Я пытаюсь создать SelectList, оборачивая целую кучу объектов модели в отдельные объекты модели представления.

У меня есть вид модели класса:

public class ReferenceDocumentSelectionViewModel
{
    public ReferenceDocument Document { get; set; }

    public int ID { get { return Document.ID; } }

    public String DisplayText 
    { 
        get 
        { 
            return Document.DocumentNumber + 
                   Document.Version + 
                   Document.Revision + 
                   Document.Sheet; 
        } 
    }
}

Затем я пытаюсь использовать лямбда-выражения для создания списка этих объектов:

var docs =  _db.ReferenceDocuments
               .Select(r => new ReferenceDocumentSelectionViewModel() 
               { 
                   Document = r 
               });

перед присвоением их SelectList:

ReferenceDocList = new SelectList(docs.OrderBy(r => r.DisplayText), 
                                  "ID", 
                                  "DisplayText");

На мой взгляд, я получаю доступ к списку выбора следующим образом:

@Html.DropDownListFor(model => model.SelectedReferenceDoc, 
                      Model.ReferenceDocList, 
                      "-Select-", 
                      new { id = "ReferenceList" })

, где model.SelectedReferenceDoc - целочисленное свойство в другой модели представления.

Я думал, что это будет работать, но вместо этого я получаю следующую ошибку:

Указанный элемент типа 'DisplayText' не поддерживается в LINQ для Сущности. Только инициализаторы, элементы сущностей и навигация сущностей свойства поддерживаются.

Помощь

РЕДАКТИРОВАТЬ: При дальнейшем расследовании кажется, что это docs.OrderBy(r => r.DisplayText), что вызывает проблему. Если я удаляю это, это работает отлично. Есть идеи, почему это не разрешено?

1 Ответ

3 голосов
/ 05 октября 2011

Поскольку DisplayText не является сопоставленным свойством, EF не знает, как перевести это в SQL.Вот почему он выдает ошибку.

Вы можете использовать здесь сортировку LINQ-to-Objects, сначала загрузив все элементы

var docs =  _db.ReferenceDocuments
               .Select(r => new ReferenceDocumentSelectionViewModel() 
               { 
                   Document = r 
               }).ToList();

Затем отсортировав их в памяти

ReferenceDocList = new SelectList(docs.OrderBy(r => r.DisplayText), 
                                  "ID", 
                                  "DisplayText");

Или сортировка по каждому свойству

var docs =  _db.ReferenceDocuments
               .OrderBy(r => r.DocumentNumber)
               .ThenBy(r => r.Version)
               .ThenBy(r => r.Revision)
               .ThenBy(r => r.Sheet)
               .Select(r => new ReferenceDocumentSelectionViewModel() 
               { 
                   Document = r 
               });

ReferenceDocList = new SelectList(docs, 
                                  "ID", 
                                  "DisplayText");

Таким образом, сортировка в базе данных будет выполняться намного эффективнее, чем в памяти.

Следовательно, второй вариант предпочтительнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...