es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Es posible ejecutar dos consultas LINQ de tipos diferentes al mismo tiempo?

Tengo dos modelos de MaterialRequest y SecurityUser:

“`public class MaterialRequestMaster : BaseDomain
{
public string RequestCode { get; private set; }
public string Description { get; private set; }
public GlobalEnums.MaterialRequestStatus Status { get; set; }
public int UserId { get; private set; }

<p>public SecurityUser User { get; private set; }
}<br>
<code>
</code>
public class SecurityUser : IdentityUser<int>
{
public string Name { get; set; }
public int PersonelCodeId { get; set; }
public ICollection<materialrequestmaster> MaterialRequestMaster { get; set; }
}

<pre><code><br />Quiero realizar una búsqueda en Material Requests basada en el nombre de usuario, por lo que creo un ViewModel de Material Request de la siguiente manera:

“`public class MaterialRequestMasterViewModel
{
public long Id { get; set; }
[Required(ErrorMessage = “Por favor ingrese el código”)]
public string RequestCode { get; set; }
public GlobalEnums.MaterialRequestStatus Status{ get; set; }
[MaxLength(255)]
public string Description { get; set; }
public int UserId { get; set; }
public string UserName { get; set; }
public bool IsDeleted { get; set; }
public DateTime CreationDate { get; set; }
}

Obtengo el nombre de usuario desde la vista y creo una cadena de búsqueda como “x=>x.UserName.Contains(“Something”)” y la envío a mi método de búsqueda de Material Request como searchQuery:

“`public IPagedList GetPagedRecords(int pageNumber, int pageSize, string orderByCol, string order, string searchQuery)
{
IQueryable<materialrequestmaster> query;</materialrequestmaster></materialrequestmasterviewmodel></materialrequestmaster></int></p>

<p>query = query = _IMRMRepository.Get(); //Obtiene todos los registros de <materialrecustmaster></materialrecustmaster></p>

<p>IQueryable<materialrequestmasterviewmodel> searchedQuery;</materialrequestmasterviewmodel></p>

<p>searchedQuery = query.Select(n => new MaterialRequestMasterViewModel //Rellena el ViewModel
(
n.Id,
n.RequestCode,
n.Status,
n.Description,
n.UserId,
n.User.Name,
n.CreationDate,
n.IsDeleted
));</p>

<p>if (!string.IsNullOrWhiteSpace(searchQuery))
searchedQuery = searchedQuery.Where(searchQuery);</p>

<p>return searchedQuery.ToPagedList(pageNumber, pageSize);
}
“`

El método ToPagedList() no puede ejecutar la consulta debido a un problema de traducción de LINQ. ¿Es la forma correcta de hacerlo?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    No, no es una forma adecuada de hacerlo. El enfoque de la cadena “where” no es una forma recomendada de filtrar datos porque puede llevar a ataques de inyección SQL y no es seguro en cuanto a tipos. En su lugar, puedes usar expresiones LINQ para construir consultas dinámicas que sean seguras en cuanto a tipos y eviten ataques de inyección SQL.

    Una forma de utilizar expresiones LINQ para filtrar Solicitudes de Material basándose en el Nombre de Usuario es la siguiente:

    public IPagedList<materialrequestmasterviewmodel> GetPagedRecords(int pageNumber, int pageSize, string orderByCol, string order, string searchQuery)
    {
        IQueryable<materialrequestmaster> query = _IMRMRepository.Get(); // Obtiene todos los registros de <materialrequestmaster>
    
        if (!string.IsNullOrWhiteSpace(searchQuery))
        {
            query = query.Where(mrm => mrm.User.Name.Contains(searchQuery));
        }
    
        IQueryable<materialrequestmasterviewmodel> searchedQuery = query.Select(n => new MaterialRequestMasterViewModel // Llena el ViewModel
        (
            n.Id,
            n.RequestCode,
            n.Status,
            n.Description,
            n.UserId,
            n.User.Name,
            n.CreationDate,
            n.IsDeleted
        ));
    
        return searchedQuery.ToPagedList(pageNumber, pageSize);
    }
    

    Este enfoque utiliza el método Where para construir una expresión LINQ que filtra las Solicitudes de Material basándose en el Nombre de Usuario. El IQueryable resultante será seguro en cuanto a tipos y evitará ataques de inyección SQL. Luego, se utiliza el método Select para crear una lista de objetos MaterialRequestMasterViewModel.

    Nota: Recuerda agregar el espacio de nombres using System.Linq.Expressions; para utilizar las expresiones LINQ.

Comments are closed.