2013-09-24 9 views
10

voglio legare GridView tramite Entity Framework, ma getta errore come-un tipo anonimo non può avere più oggetti con lo stesso nome

un tipo anonimo non può avere più proprietà con lo stesso nome di entità Framwrok

Ecco il mio metodo.

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

Segnala errore qui. usr.UserId.

risposta

18

Il problema diretto è nel tipo anonimo new { m.UserId, u.UserId }: lo stesso nome due volte. È possibile risolvere il problema dando nomi di proprietà espliciti, ad esempio: new { u1 = m.UserId, u2 = u.UserId }.

Ma poi il prossimo numero sarà che entrambi i tipi anonimi che definiscono il join non hanno gli stessi nomi di proprietà, quindi la correzione finale è questo:

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 risposta è corretta. Voglio solo mostrare una soluzione più semplice - dare un nome solo alla prima proprietà UserId:

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

Possibile. L'unica cosa è che rende il codice meno auto-esplicativo perché il primo UserId potrebbe non avere nulla a che fare con 'MembershipUserID'. L'utilizzo di due nomi "anonimi" mostra che le proprietà sono solo segnaposto. –

+0

@GertArnold ID primo utilizzo ha qualcosa a che fare con l'appartenenza :) è id dalla tabella aspnet_Membership. Inoltre penso che 'u1' sia molto meno auto-esplicativo di' MembershipUserID'. Ho upvoted la tua risposta quindi è anche completamente corretto e spiega il motivo dell'errore :) –

+1

Certo, nessuna preoccupazione! È solo che mi piace che il mio codice mostri che vengono applicati i nomi di proprietà identiche. Forse solo una questione di gusti. –

Problemi correlati