Как создать и заполнить вложенную ViewModel хорошо - PullRequest
0 голосов
/ 01 ноября 2010

У меня есть модель просмотра, которая имеет серьезное вложение. Мне нужно заполнить его из Entity Framework 4. Я попытался создать один большой оператор linq для его заполнения, но он говорит, что не распознает методы .ToList (). Компилируется нормально. Ошибка выполнения

LINQ to Entities does not recognize the method 
'System.Collections.Generic.List`1[ProductDepartment] ToList[ProductDepartment]
(System.Collections.Generic.IEnumerable`1[ProductDepartment])' method, 
and this method cannot be translated into a store expression.

Каков более эффективный способ заполнения чего-либо подобного без выполнения нескольких тысяч обращений к базе данных?

List<Product> Products {
    int ID
    string Name
    ...
    List<Department> Departments {
        int ID
        string Name
    }
    List<Image> Images {
        int ID
        string Name
    }
    List<Price> Prices {
        int ID
        string Name
        List<Version> Versions {
            int ID
            string Name
            List<Pages> Pages {
                int ID
                string Name
}   }   }   }

Ужасный код Linq выглядит примерно так

var myProducts = (from myProduct in DC.MyProducts
                  where p => p.productGroup == 1
                  select new Product {
                      ID = myProduct.ID,
                      Name = myProduct.Name,
                      Departments = (from myDept in DC.MyDepartments
                                     where q => q.fkey = myProduct.pkey
                                     select new Department {
                                         ID = myDept.ID,
                                         Name = myDept.Name
                                     }).ToList(),
                      ...
                      //Same field assignment with each nesting
                  }).ToList();

Обновление:

Исправлено удаление всех списков .ToLists (), которые в любом случае работали лучше.

Теперь я должен выполнить фильтрацию и сортировку конечного продукта.

Ответы [ 2 ]

1 голос
/ 01 ноября 2010

Почему вы требуете всю эту информацию за один раз?Вы можете использовать отложенную загрузку при доступе к вложенному свойству?

1 голос
/ 01 ноября 2010

Ну, для начала, это одна сумасшедшая модель, но я предполагаю, что вы уже знаете это.

Вы действительно нуждаетесь в всей этой информации сразу?

Я сыграю адвоката дьявола здесь и предположу, что у вас есть, и в этом случае у вас есть несколько логических вариантов:

1) Как упомянуто @xandy - используйте .Include чтобы загрузить ваши ассоциации в один звонок.Предполагается, что вы настроили навигационные свойства для своих объектов в EDMX.

2) Используйте представление.Поместите всю эту сумасшедшую логику объединения в базу данных, сделав работу EF очень простым выбором в представлении.Недостатком этого является то, что ваши запросы к представлению в основном становятся только для чтения, так как я не верю, что вы можете выполнять обновления сущности, сопоставленной с представлением.

Так что это ваш выбор - если этотолько для сбора данных для отображения данных, используйте View, иначе загружайте ваши ассоциации одним нажатием.

Кроме того, будьте осторожны при написании ваших запросов LINQ - я вижу, что у вас есть несколько операторов .ToList, которые приведут кзапрос должен быть выполнен.

Создайте свой запрос, затем выполните .ToList один раз в конце.

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