Asp.net-Membership

如何最好地在會員提供者上實施自定義搜尋

  • October 27, 2012

開箱即用,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&lt;MembershipUser&gt; searchResults = allUsers.Where(user =&gt; 
       Profile.GetProfile(user.UserName).Firm.ToLowerInvariant()
       .Contains(firmName.ToLowerInvariant())).ToList();

在這種情況下 allUsers 是一個列表,我必須用 Membership.GetAllUsers() 集合中的項目填充它。

那麼你不能直接投嗎?

IEnumerable&lt;MembershipUser&gt; searchResults = Membership.GetAllUsers().Cast&lt;MembershipUser&gt;();

希望這對你們有幫助

引用自:https://stackoverflow.com/questions/419127