2016-08-08 95 views
0

在我的MVC5應用程序中,我試圖通過簡單的查詢爲選擇列表框填充SelectListItems的IEnumerable,並通過簡單的查詢將「select」屬性設置爲true。代碼如下:MVC5:通過LINQ查詢將「Selected」屬性設置爲true

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; 

在調試器中,我驗證了與會者確實正在返回預期的ApplicationUser集合。我還測試了這款是否適合個人用戶提供這樣的事情,我也得到預期的結果布爾:

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

這個工作剛找到當ID爲1的用戶是與會者但ID爲2的用戶不。

我的代碼在沒有與會者的情況下也可以正常工作。但是,即使有一個與會者出現錯誤:「無法創建類型爲'SdNet.Models.ApplicationUser'的常量值,只有基本類型或枚舉類型在此上下文中受支持。」

我最好的猜測是該表達式沒有返回包含查詢的布爾值,但我不知道爲什麼會這樣。任何幫助你可以提供將不勝感激。

謝謝!

回答

1

錯誤消息告訴您EF無法處理attendees.Contains(c)條件,因爲attendees不是原始類型/枚舉類型的集合。

的解決方案是製備和使用基本類型(intstringGuid等,一般的PK型)這樣的集合:

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

由於@IvanStoev,完美地工作。 – ChemProfMatt

相關問題