2013-09-24 7 views
10

ich Gridview durch Entity Framework binden wollen, aber es wirft Fehler wie-Ein anonymer Typ darf nicht mehrere Objekte mit dem gleichen Namen

Ein anonymer Typ nicht mehrere Objekte mit dem gleichen Namen Entity Framwrok

haben

Hier ist meine Methode.

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

Es zeigt Fehler hier. usr.UserId.

Antwort

18

Das direkte Problem ist im anonymen Typ new { m.UserId, u.UserId }: den gleichen Namen zweimal. Sie können das beheben, indem Sie explizite Eigenschaftsnamen angeben, zum Beispiel: new { u1 = m.UserId, u2 = u.UserId }.

Aber dann ist die nächste Frage wird sein, dass beide anonyme Typen, die die Join definieren die gleichen Eigenschaftsnamen nicht haben, so dass diese die endgültige Lösung ist:

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 Antwort richtig ist. Ich möchte nur eine einfachere Lösung zeigen - geben Sie nur der ersten UserId-Eigenschaft einen Namen:

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

Möglich. Das einzige, was es macht, ist, dass der Code weniger selbsterklärend ist, weil die erste UserId möglicherweise nichts mit "MembershipUserID" zu tun hat. Die Verwendung von zwei "anonymen" Namen zeigt, dass die Eigenschaften nur Platzhalter sind. –

+0

@GertArnold erste Verwendung ID hat etwas mit der Mitgliedschaft zu tun :) Es ist ID von aspnet_Membership Tabelle. Außerdem denke ich, dass "u1" viel weniger selbsterklärend ist als "MembershipUserID". Ich habe Ihre Antwort upvoted, also ist es auch völlig korrekt und es erklärt Grund des Fehlers :) –

+1

Sicher, überhaupt keine Sorgen! Es ist nur so, dass ich meinen Code mag, um zu zeigen, dass identische Eigenschaftsnamen erzwungen werden. Vielleicht nur eine Frage des Geschmacks. –

Verwandte Themen