Cómo implementar mejor la búsqueda personalizada en un proveedor de membresía

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

  •  03-07-2019
  •  | 
  •  

Pregunta

De fábrica, System.Web.Security.Membership implementa un par de métodos de búsqueda:

  • Buscar usuarios por correo electrónico
  • Buscar usuarios por nombre

estoy usando el Proyecto WSAT de CodePlex para administrar mi base de datos de Membresía.La herramienta implementa propiedades de perfil adicionales en una clase ProfileCommon.

Digamos que tengo una propiedad llamada Firme en el perfil del usuario.

Necesito implementar un método de búsqueda personalizado para buscar en la propiedad Firma y me gustaría hacer todo esto en código.No quiero escribir un procedimiento almacenado (ya que todas las propiedades del perfil se almacenan en 1 columna de base de datos en la herramienta WSAT).

Obviamente, algo como esto no es la forma correcta de hacerlo, pero aquí es solo para demostrar cómo acceder a las propiedades del perfil del usuario:

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

¿Puedo convertir esto en algo bueno de LINQ?

¿Fue útil?

Solución 2

Recibí ayuda de un colega que es bueno con linq. El desafío aquí es que MembershipUserCollection no implementa IEnumerable & Lt; T & Gt; (!)

        List<MembershipUser> searchResults = allUsers.Where(user => 
        Profile.GetProfile(user.UserName).Firm.ToLowerInvariant()
        .Contains(firmName.ToLowerInvariant())).ToList();

en este caso, allUsers es una lista que tuve que completar con los elementos de la colección Membership.GetAllUsers ().

Otros consejos

Bueno, ¿no puedes simplemente lanzarlo?

IEnumerable<MembershipUser> searchResults = Membership.GetAllUsers().Cast<MembershipUser>();

Espero que esto les ayude chicos

Solo para el registro, creé este método de extensión que creo que funciona:

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

También convierte el MembershipUserCollection en un IEnumerable<MembershipUser> para que todos los demás métodos LINQ funcionen después.

No hay una función integrada proporcionada por microsoft. Aquí está el ejemplo de usuario de membresía de búsqueda con nombre de usuario y dirección de correo electrónico
Ejemplo:
Simplemente copie la siguiente función e impleméntela - Hecho ...

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();
        }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top