2015-09-28 53 views
0

我想我有一個高級時刻,但我也認爲我之前沒有遇到過這種情況。我在我的MVC5 Identity 2.1 Users表中有兩列。顯示相同表格中的相關數據

UserId | BannedBy (and also an IsBanned bool) 

這兩個字段都是userid guid字符串。但是,BannedBy引用同一用戶表中的不同用戶。

當我顯示禁止用戶的視圖(一個表和每行都是一個禁用用戶)時,我不想顯示BannedBy guid,我想顯示該BannedBy guid的相關用戶名。但是,我似乎無法弄清楚我需要做什麼。

我已經嘗試了視圖模型和方法的方法:

public ActionResult BannedUsers() 
    { 
     var bannedUsers = db.Users.Where(d => d.IsBanned); 

     var model = new BannedUsersViewModel 
     { 
      BannedUsers = bannedUsers, 
      BannedByUserName = GetUserName(bannedUsers.BannedBy) 
     }; 

     return View(model); 
    } 

然後像一個外部的方法來我的視圖模型:

var model = new BannedUsersViewModel 
     { 
      BannedUsers = bannedUsers 
     }; 
     model.BannedByUserName = GetUserName(model.bannedUsers.BannedBy); 

但是,似乎我不能使用bannedUsers.BannedBy (我還嘗試了所有上面的大寫字母B ... BannedUsers.BannedBy)數據,然後才真正呈現它們?現在我已經報廢的視圖模型,我試圖做類似的相關數據上我的查詢聯接:

db.Users.Join(d => d.BannedBy == d.UserId).Where(d => d.IsBanned); 

(我敢肯定,這是遙遠的,我只是想給你一個想法)

有沒有人知道這樣做的正確方法?我也在考慮從我的角度調用一種方法,但似乎這會違反MVC規則?

謝謝。

更新:這裏是GetUserName方法:

public string GetUserName(string userId) 
    { 
     var result = db.Users.Find(userId); 

     return result.UserName; 
    } 

更新#2:這裏是BannedUsersViewModel:

public class BannedUsersViewModel 
{ 
    public IEnumerable<ApplicationUser> BannedUsers { get; set; } 
    public string BannedByUserName { get; set; } 

} 

更新#3:PIC: BannedUsers

+0

您還可以顯示擴展用戶實體及其映射嗎?因爲你需要配置自己加入用戶實體 – lazy

+0

那麼,如果'BannedUsers'是一個被禁止的用戶列表,那麼'BannedByUserName'確實不需要是禁止這些用戶的用戶列表?我覺得'GetUserName'只有一個'Guid'。雖然我可能是錯的。 –

+0

@Jason Boyd是的,你是對的。 GetUserName只是使用guid在db.Users表上進行提取。我將編輯我的帖子以包含該內容。我仍在消化你寫的其他內容......謝謝。 – SumNone

回答

0

我要對此進行刺探。我們可以根據需要對其進行修改(除非我完全脫離基地,在這種情況下,我會刪除這些,我們都會假裝它從未發生過)。這是否讓你在球場:

public ActionResult BannedUsers() 
{ 
    var bannedUsers = 
     db.Users 
     .Where(d => d.IsBanned) 
     .Join(
      db.Users, 
      bannee => bannee.BannedBy, 
      banner => banner.UserId, 
      (bannee, banner) => new BannedUser() 
       { 
        BannedByUserName = banner.UserName, 
        BannedUser = bannee 
       }) 
     .AsEnumerable(); 

    var model = new BannedUsersViewModel 
    { 
     BannedUsers = bannedUsers 
    }; 

    return View(model); 
} 

public class BannedUsersViewModel 
{ 
    public IEnumerable<BannedUser> BannedUsers { get; set; } 
} 

public class BannedUser 
{ 
    public ApplicationUser BannedUser { get; set; } 
    public string BannedByUserName { get; set; } 
} 

的想法是,我們得到了所有被取締的用戶,他們加入到所有通過了禁止它們的用戶禁止的那些用戶,然後用戶組的用戶的。您最終得到的是禁止其他用戶及其禁止用戶的用戶對象集合。

+0

聽起來很有希望,看起來很棒。但是,我得到一個AnonymousType轉換錯誤:'不能隱式轉換類型'System.Linq.IQueryable >'到'System.Collections.Generic.IEnumerable 」。一個明確的轉換存在(你是否缺少一個轉換?)'即使當我將bannedUsers直接傳遞給視圖(減去視圖模型)時,它也會給出類似的錯誤。我試圖將我的viewmodel BannedUsers更改爲IQueryable ,它不喜歡那樣。有任何想法嗎?再次感謝... – SumNone

+0

我在上面添加了BannedUsersViewModel ... :) – SumNone

+0

無論你想出什麼解決方案,你都需要修改你的'BannedUsersViewModel'。它在邏輯上不合理。 「BannedUsers」中的用戶可能已被任何數量的不同用戶禁用;您將使用哪些名稱作爲「BannedByUserName」。讓我以一個完整的例子來更新我將如何處理它。 –

0

到目前爲止,我在@ lazy的評論中做了自我加入。但我不確定我對此感覺如何。所以基本上,我已將此添加到我的IdentityModels.cs public class ApplicationUser : IdentityUser下:

[ForeignKey("BannedBy")] 
public virtual ApplicationUser BannedByUser { get; set; } 

然後在我的控制,改變了我原來的查詢到一個列表:

var bannedUsers = db.Users.Where(d => d.IsBanned).ToList(); 

return View(bannedUsers); 

(如果我沒有轉換爲列表它抱怨打開了多個數據讀取器。)然後在我在我的foreach循環查看:

@Html.DisplayFor(modelItem => item.BannedByUser.UserName) 

和吊杆: Banned Users

我有點擔心對性能的影響......特別是對於未使用的頁面?往往並不是那麼重要。如果頁面沒有被調用(如使用創建的索引等),是否會產生影響?我也有點懷疑,因爲似乎有一些神奇的身份發生。

無論如何,我仍然願意接受其他想法......或者對這個想法有所瞭解。再次感謝大家的幫助。