Asp.net-Membership
如何最好地在會員提供者上實施自定義搜尋
開箱即用,System.Web.Security.Membership 實現了幾個搜尋方法:
- 通過電子郵件查找使用者
- 按名稱查找使用者
我正在使用CodePlex 的 WSAT 項目來管理我的會員數據庫。該工具在 ProfileCommon 類中實現了額外的配置文件屬性。
假設我在使用者的個人資料中有一個名為Firm的屬性。
我需要實現一個自定義搜尋方法來搜尋公司屬性,我想在程式碼中完成這一切。不想編寫儲存過程(因為所有配置文件屬性都儲存在 WSAT 工具的 1 個數據庫列中)。
這樣的事情顯然不是正確的方法,但這裡只是為了展示訪問使用者的配置文件屬性:
private MembershipUserCollection SearchByFirm(string firmName, MembershipUserCollection allRegisteredUsers) { MembershipUserCollection searchResults = new MembershipUserCollection(); foreach (MembershipUser user in allRegisteredUsers) { ProfileCommon profile = Profile.GetProfile(user.UserName); if (profile.Firm.ToLowerInvariant().Contains(firmName.ToLowerInvariant())) { searchResults.Add(user); } } return searchResults; }我可以把它變成一些 LINQ 的優點嗎?
從一個擅長linq的同事那裡得到了一些幫助。這裡的挑戰是 MembershipUserCollection 沒有實現 IEnumerable< T > (!)。
List<MembershipUser> searchResults = allUsers.Where(user => Profile.GetProfile(user.UserName).Firm.ToLowerInvariant() .Contains(firmName.ToLowerInvariant())).ToList();在這種情況下 allUsers 是一個列表,我必須用 Membership.GetAllUsers() 集合中的項目填充它。
那麼你不能直接投嗎?
IEnumerable<MembershipUser> searchResults = Membership.GetAllUsers().Cast<MembershipUser>();希望這對你們有幫助