2010-06-13 35 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

相關問題