какие возможные обходные пути существуют для «поддерживаются только конструкторы без параметров в Linq to Entites» - PullRequest
4 голосов
/ 13 июня 2010

В моем запросе мне нужно вернуть экземпляры класса, который не имеет конструктора по умолчанию (в частности, это в пользовательском поставщике членства, и виновником является MembershipUser)

var users = from l in context.Logins
    select new MembershipUser(
        Name,
        l.Username, // username
        l.Id, // provider key
        l.MailTo,
        l.PasswordQuestion,
        l.Notes.FirstOrDefault().NoteText,
        l.IsApproved,
        l.IsLockedOut,
        l.CreatedOn,
        l.LastLoginOn.HasValue ? l.LastLoginOn.Value : DateTime.MinValue,
        l.LastActivityOn.HasValue ? l.LastActivityOn.Value : DateTime.MinValue,
        DateTime.MinValue,
        l.LastLockedOutOn.HasValue ? l.LastLockedOutOn.Value : DateTime.MinValue
    );

является синтаксически правильным, но приводит к ошибке времени выполнения, так как в LINQ to Entities поддерживаются только беспараметрические конструкторы и инициализаторы.

Обновление: в качестве обходного пути я сейчас переношу выбор в List (который разрешает выполнение выражения запроса)затем я могу выбрать нового пользователя MembershipUser из этого списка.

var users = (from l in context.Logins
    select new { login = l }).ToList().Select(u => new MembershipUser (
Name,
u.login.Username, // username
u.login.Id, // provider key
u.email.MailTo,
u.login.PasswordQuestion,
u.login.Notes.FirstOrDefault().NoteText,
u.login.IsApproved,
u.login.IsLockedOut,
u.login.CreatedOn,
u.login.LastLoginOn.HasValue ? u.login.LastLoginOn.Value : DateTime.MinValue,
u.login.LastActivityOn.HasValue ? u.login.LastActivityOn.Value : DateTime.MinValue,
DateTime.MinValue,
u.login.LastLockedOutOn.HasValue ? u.login.LastLockedOutOn.Value : DateTime.MinValue
    );

1 Ответ

12 голосов
/ 13 июня 2010

Мне кажется, проблема в том, что вам нужно выйти из LINQ to Entities и перейти в LINQ to Objects, что позволяет произвольно вызывать методы.Метод расширения AsEnumerable сделает это за вас.Как насчет этого:

var users = from l in context.Logins.AsEnumerable() 
    select new MembershipUser( 
        Name, 
        l.Username, // username 
        l.Id, // provider key 
        l.MailTo, 
        l.PasswordQuestion, 
        l.Notes.FirstOrDefault().NoteText, 
        l.IsApproved, 
        l.IsLockedOut, 
        l.CreatedOn, 
        l.LastLoginOn ?? DateTime.MinValue, 
        l.LastActivityOn ?? DateTime.MinValue, 
        DateTime.MinValue, 
        l.LastLockedOutOn ?? DateTime.MinValue 
    ); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...