¿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
{
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?
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:
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étodoSelect
para crear una lista de objetosMaterialRequestMasterViewModel
.Nota: Recuerda agregar el espacio de nombres
using System.Linq.Expressions;
para utilizar las expresiones LINQ.