كيفية تنفيذ البحث المخصص بشكل أفضل على موفر العضوية

StackOverflow https://stackoverflow.com/questions/419127

  •  03-07-2019
  •  | 
  •  

سؤال

خارج الصندوق، يقوم System.Web.Security.Membership بتنفيذ طريقتين للبحث:

  • البحث عن المستخدمين بالبريد الإلكتروني
  • FindUsersByName

أنا أستخدم مشروع WSAT من CodePlex لإدارة قاعدة بيانات العضوية الخاصة بي.تطبق الأداة خصائص ملف التعريف الإضافية في فئة ProfileCommon.

لنفترض أن لدي عقار يسمى حازم في الملف الشخصي للمستخدم.

أحتاج إلى تنفيذ طريقة بحث مخصصة للبحث في خاصية الشركة، وأود أن أفعل كل ذلك بالرمز.لا تريد كتابة إجراء مخزن (نظرًا لأن جميع خصائص الملف الشخصي مخزنة في عمود قاعدة بيانات واحد في أداة WSAT).

من الواضح أن شيئًا كهذا ليس هو الطريقة الصحيحة للقيام بذلك، ولكن هنا فقط لتوضيح الوصول إلى خصائص الملف الشخصي للمستخدم:

    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؟

هل كانت مفيدة؟

المحلول 2

حصلت على بعض المساعدة من زميل يجيد استخدام 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>();

آمل أن يساعد هذا يا رفاق

فقط للعلم لقد قمت بإنشاء طريقة الامتداد هذه والتي أعتقد أنها تعمل نوعًا ما:

namespace WebDibaelsaMVC.Utils.MembershipUserCollectionExtensions
{
    public static class MembershipUserCollectionExtensions
    {
        public static IEnumerable<MembershipUser> Where(this MembershipUserCollection userCollection,Func<MembershipUser,bool> func)
        {
            foreach (MembershipUser membershipUser in userCollection)
            {
                 if (func(membershipUser))
                    yield return membershipUser;
            }
        }
    }
}

كما يقوم بتحويل MembershipUserCollection إلى IEnumerable<MembershipUser> لذلك تعمل جميع طرق LINQ الأخرى بعد ذلك.

لا توجد وظيفة مدمجة تقدمها Microsoft.فيما يلي مثال لمستخدم عضوية البحث باستخدام اسم المستخدم وعنوان البريد الإلكتروني
مثال:
فقط انسخ الوظيفة أدناه وقم بتنفيذها - تم...

Public List<MembershipUser> SearchMembershipUser(string strUserName, String strEmail)
        {           
            IEnumerable<MembershipUser> MUser;
            if ((!string.IsNullOrEmpty(strUserName) || !string.IsNullOrEmpty(strEmail)))
            {
                if (!string.IsNullOrEmpty(strUserName) && !string.IsNullOrEmpty(strEmail))
                {
                    MUser = Membership.GetAllUsers().Cast<MembershipUser>()
                        .Where(x => x.UserName != CurrentUser && x.UserName == strUserName && x.Email == strEmail);
                }
                else if (!string.IsNullOrEmpty(strUserName))
                {
                    MUser = Membership.GetAllUsers().Cast<MembershipUser>()
                        .Where(x => x.UserName != CurrentUser && x.UserName == strUserName);
                }
                else
                {
                    MUser = Membership.GetAllUsers().Cast<MembershipUser>()
                        .Where(x => x.UserName != CurrentUser && x.Email == strEmail);
                }
            }
            else
            {
                MUser = Membership.GetAllUsers().Cast<MembershipUser>().Where(x => x.UserName != CurrentUser);
            }
            return MUser.OrderBy(x => x.UserName).ToList();
        }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top