2013-09-24 10 views
10

Chcę powiązać gridview przez Entity Framework, ale wyrzuca błąd jak-anonimowy typ nie może mieć wiele właściwości o tej samej nazwie

Anonimowy typu nie może mieć wiele właściwości o tej samej nazwie Podmiot Framwrok

Oto moja metoda.

public void UserList(GridView grdUserList) 
{ 
    using (TreDbEntities context = new TreDbEntities()) 
    { 

     var query =(from m in context.aspnet_Membership 
        from u in context.aspnet_Users 
        join usr in context.Users 
        on new { m.UserId, u.UserId } 
        equals new { usr.MembershipUserID, usr.UserId } 
        into UserDetails 
        from usr in UserDetails 
        select new { 
         CreationDate = m.CreateDate, 
         email = m.Email, 
         UserName = u.LoweredUserName, 
         Name = usr.FirstName + usr.LastNameLastName, 
         Active=usr.IsActive 
        }).ToList(); 
    } 
} 

To pokazuje błąd tutaj. usr.UserId.

Odpowiedz

18

Bezpośredni numer jest w anonimowym typie new { m.UserId, u.UserId }: tę samą nazwę dwa razy. Możesz to naprawić, podając jawne nazwy właściwości, na przykład: new { u1 = m.UserId, u2 = u.UserId }.

Ale potem następny problem będzie, że oba typy anonimowe, które definiują łączenia nie będą mieć te same nazwy właściwości, więc ostateczny dylemat jest taki:

public void UserList(GridView grdUserList) 
{ 
    using (TreDbEntities context = new TreDbEntities()) 
    { 
     var query =(from m in context.aspnet_Membership 
        from u in context.aspnet_Users 
        join usr in context.Users 
        on new { u1 = m.UserId, u2 = u.UserId } 
        equals new { u1 = usr.MembershipUserID, u2 = usr.UserId } 
        into UserDetails 
        from usr in UserDetails 
        select new { CreationDate = m.CreateDate, 
           email = m.Email, 
           UserName = u.LoweredUserName, 
           Name = usr.FirstName + " " + usr.LastName, 
           Active = usr.IsActive 
           } 
        ).ToList(); 
    } 
} 
4

@Gert odpowiedź jest poprawna. Po prostu chcesz pokazać prostsze rozwiązanie - nadaj nazwę tylko pierwszej właściwości UserId:

on new { MembershipUserID = m.UserId, u.UserId } 
+0

Możliwe. Jedyną rzeczą jest to, że kod jest mniej zrozumiały, ponieważ pierwszy UserId może nie mieć nic wspólnego z 'MembershipUserID'. Użycie dwóch "anonimowych" nazw wskazuje, że właściwości są po prostu symbolami zastępczymi. –

+0

@GertArnold first use id ma coś wspólnego z członkostwem :) to id z tablicy aspnet_Membership. Również myślę, że 'u1' jest dużo mniej oczywiste niż" MembershipUserID ". Przegłosowałem twoją odpowiedź, więc jest ona również całkowicie poprawna i wyjaśnia powód błędu :) –

+1

Oczywiście, nie martw się! Po prostu podoba mi się mój kod, który pokazuje, że wymuszone są identyczne nazwy właściwości. Może tylko kwestia gustu. –

Powiązane problemy