有哪些可行的解决方法“Linq to Entities中仅支持无参数构造函数”

时间:2010-06-13 01:53:13

标签: entity-framework linq-to-entities

在我的查询中,我需要返回没有默认构造函数的类的实例(特别是这是在自定义成员资格提供程序中,而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 个答案:

答案 0 :(得分:12)

我认为问题是你需要从LINQ迁移到实体并转到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 
    );