Why do I return iQueryable instead of an instance of my class?

3

I'm getting the following error when returning an object when validating the login:

  

You can not implicitly convert the type 'System.Linq.IQueryable' 'to' Business.clsUser.ValidSessionU '. An explicit conversion already exists (check if a conversion is missing)

My Code is as follows:

public class ValidarSesionU
{
    public Int64 usu_IDUsuario { get; set; }
    public string usu_nombre { get; set; }
    public Int32 usu_IDRol { get; set; }
}

public ValidarSesionU ValidarSesion(string stUsuario, string stPassword)
{
    try
    {
        using (BDGestionReclamosEntities BD = new BDGestionReclamosEntities())
        {
            var iqValidarSesion = from x in BD.Usuario
                                  where x.usu_nombre == stUsuario && x.usu_contraseña == stPassword
                                  select new ValidarSesionU
                                  {
                                      usu_IDUsuario = x.usu_IDUsuario,
                                      usu_nombre = x.usu_nombre,
                                      usu_IDRol = x.usu_IDRol
                                  };

            return iqValidarSesion; //ACÁ DEVUELVE EL ERROR
        }
    }
    catch (Exception ex)
    {
        return null;
    }
}

The only way I could solve it is by converting the object to List :

public List<ValidarSesionU> ValidarSesion(string stUsuario, string stPassword)
{
    try
    {
        using (BDGestionReclamosEntities BD = new BDGestionReclamosEntities())
        {
            var iqValidarSesion = from x in BD.Usuario
                                  where x.usu_nombre == stUsuario && x.usu_contraseña == stPassword
                                  select new ValidarSesionU
                                  {
                                      usu_IDUsuario = x.usu_IDUsuario,
                                      usu_nombre = x.usu_nombre,
                                      usu_IDRol = x.usu_IDRol
                                  };

            return iqValidarSesion.ToList<ValidarSesionU>();
        }
    }
    catch (Exception ex)
    {
        return null;
    }
}

But my intention is to return an object, not a list, since it is only 1 record that must be returned.

How can I convert to return an object and not list it?

  

FINALLY I HAVE THIS MY CODE:

        public class ValidarSesionU
    {
        public Int64 usu_IDUsuario { get; set; }
        public string usu_nombre { get; set; }
        public Int32 usu_IDRol { get; set; }
        public string usu_Password { get; set; }

    }

    public ValidarSesionU ValidarSesion(string stUsuario, string stPassword)
    {
        try
        {
            using (BDGestionReclamosEntities BD = new BDGestionReclamosEntities())
            {
                var iqValidarSesion = from x in BD.Usuario
                                      select new ValidarSesionU
                                      {
                                          usu_IDUsuario = x.usu_IDUsuario,
                                          usu_nombre = x.usu_nombre,
                                          usu_IDRol = x.usu_IDRol,
                                          usu_Password = x.usu_contraseña
                                      };

                return iqValidarSesion.FirstOrDefault(x => x.usu_nombre == stUsuario && x.usu_Password == stPassword);
            }
        }
        catch (Exception ex)
        {
            return null;
        }
    }
    
asked by Agu Fortini 14.09.2018 в 15:07
source

1 answer

5

I'll explain, when you use Linq To Entities, you have the possibility of putting together a query going through several states, thanks to the interface iQueryable<T>

To explain, I'm going to use some code.

//Contexto que se usará
var context = new Context();

//Una condición que siempre será necesaria
iQueryable<TuClase> query = context.TuClase.Where(x => x.Col1 == 1);

//Basado en un if, podría (o no) existir una segunda condición
if(a>b){
query.Where(x => x.Col2 > 10);
}
//Aún la query no se ejecuta, se ejecutará ahora
List<TuClase> lista = query.ToList();

Now, understanding this, in your particular case, you can use 6 methods so that your object converts from a iQueryable<ValidarSesionU> to a ValidarSesionU

  • answered by 14.09.2018 / 15:30
    source