2016-08-08 51 views
0

In meiner MVC5 Anwendung, Ich versuche, eine IEnumerable von SelectListItems für eine listbox zu füllen, die „wählen Sie“ Eigenschaft auf true über eine einfache Abfrage einstellen. Hier ist der Code:MVC5: Einstellung „Selected“ Eigenschaft auf true über eine LINQ-Abfrage

GroupActivity groupActivity = await db.GroupActivities.FindAsync(id); 

ICollection<ApplicationUser> attendees = groupActivity.Attendees; 

IEnumerable<SelectListItem> items = db.Users.Select(c => new SelectListItem 
{ 
    Value = c.Id.ToString(), 
    Text = c.LastName + ", " + c.FirstName, 
    Selected = attendees.Contains(c) 
}) 
.OrderBy(q => q.Text); 

ViewBag.Userlist = items; 

Im Debugger habe ich überprüft, dass Teilnehmer tatsächlich die erwartete Sammlung von ApplicationUsers zurückgibt. Ich habe auch getestet, ob diese für einzelne Benutzer mit so etwas wie dies funktioniert, und ich erhalte die erwarteten boolean Ergebnisse:

ApplicationUser yes = db.Users.First(n => n.Id == 1); 
var x = groupActivity.Attendees.Contains(yes); 

ApplicationUser no = db.Users.First(n => n.Id == 2); 
var y = groupActivity.Attendees.Contains(no); 

Das funktionierte nur finden, wenn der Benutzer mit der ID 1 ist ein Teilnehmer, aber Benutzer mit id 2 nicht ist .

Mein Code funktioniert auch, wenn es keine Teilnehmer gibt. Wenn es jedoch nur einen Teilnehmer gibt, erhalte ich den Fehler: "Es konnte kein konstanter Wert vom Typ 'SdNet.Models.ApplicationUser' erstellt werden. In diesem Kontext werden nur primitive Typen oder Aufzählungstypen unterstützt."

Meine beste Vermutung ist, dass der Ausdruck nicht einen Booleschen Wert zurückgibt auf der Abfrage enthält, obwohl ich weiß nicht, warum dies der Fall sein würde. Jede Hilfe, die Sie anbieten könnten, wäre willkommen.

Danke!

Antwort

1

Die Fehlermeldung besagt, dass die EF die attendees.Contains(c)-Bedingung nicht verarbeiten kann, da attendees keine Auflistung eines primitiven/enum-Typs ist.

Die Lösung herzustellen ist und eine Sammlung von einem primitiven Typ zu verwenden (int, string, Guid usw., in der Regel die PK-Typ) wie folgt aus:

var attendeeIds = groupActivity.Attendees.Select(u => u.Id).ToList(); 
IEnumerable<SelectListItem> items = db.Users.Select(c => new SelectListItem 
{ 
    Value = c.Id.ToString(), 
    Text = c.LastName + ", " + c.FirstName, 
    Selected = attendeeIds.Contains(c.Id) 
}) 
.OrderBy(q => q.Text); 
+0

Dank @IvanStoev, funktionierte perfekt. – ChemProfMatt