2010-06-13 32 views
4

在我的查询中,我需要返回没有默认构造函数的类的实例(具体而言,这是在自定义的成员资格提供程序中,并且是的MembershipUser罪魁祸首)有什么可能的解决方法是“只有无参数的构造函数支持Linq到Entites”

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 
    ); 

是syntacitally正确的,但会导致运行时错误,因为只有参数构造函数初始化和LINQ中支持到实体。

更新:作为解决方法我现在将选择带入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

你不需要浪费时间和内存上通过'ToList物化到一个'List'()'。只需要解决一个断开'IEnumerable '使用'AsEnumerable()'就像Gabe回答。 – Aaronaught 2010-06-13 13:37:30

回答

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 
    ); 
+0

不,因为“LINQ to Entities不能识别该方法,并且这种方法不能被转换成存储表达式” – 2010-06-13 12:15:17

+0

我希望更新了我的答案,使其更有用。 – Gabe 2010-06-13 13:34:04

+0

现在完全感觉。谢谢。 – 2010-06-13 22:36:37

相关问题