Ошибка при получении данных о членстве в выражении LINQ при возврате нескольких элементов - PullRequest
0 голосов
/ 10 февраля 2012

Я пытаюсь создать страницу, которая отображает список сотрудников.

Все данные аутентификации сотрудников хранятся в таблицах членства .NET, а другие данные, такие как Имя, хранятся в связанной таблице с именем Employees.

Вот мой код, который получает список сотрудников:

var viewModel = employees.OrderBy(e => e.Name).
                            Select(e => new EmployeeViewModel
                            {
                                EmployeeId = e.EmployeeID,
                                Name = e.Name,
                                Email = Membership.GetUser(e.UserID).Email,
                                Active = e.Active
                            });

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

LINQ to Entities не распознает метод метода System.Web.Security.MembershipUser GetUser (System.Object), и этот метод нельзя преобразовать в выражение хранилища.

Я провел некоторое исследование и обнаружил, что мне нужно вытащить функцию Membership.GetUser за пределы выражения LINQ. Это бы хорошо работало, если бы у меня был только один сотрудник, но я возвращаю список, поэтому пользователь будет отличаться на каждой итерации.

Кто-нибудь знает, как я могу это исправить?

1 Ответ

2 голосов
/ 10 февраля 2012

Вы можете оценить ваш выбор на стороне "клиента", вставив ToArray() перед Select(..):

var viewModel = employees.OrderBy(e => e.Name)
                           .ToArray()
                           .Select(e => new EmployeeViewModel
                            {
                                EmployeeId = e.EmployeeID,
                                Name = e.Name,
                                Email = Membership.GetUser(e.UserID).Email,
                                Active = e.Active
                            });

В этом случае EF не пытается переводить метод Membership.GetUser.

РЕДАКТИРОВАТЬ: Как указано в комментариях, это решение хотя и решает вашу проблему, но вводит другую: оно выполнит N + 1, выбирает, где N - количество сотрудников.что вы можете отобразить свои таблицы MemberShip в своей модели EF и создать связь между таблицей MemberShip и Employee.Тогда вы можете получить все данные с одним выбором и без использования Membership.GetUser().

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