Use of search / search filters with entity framework

2

I'm creating a grid with data from books and I'm adding some filters, the problem is when I create the filters of a table that has a link with that of books, I can not navigate (obs.:in a view I can navigate in the view) in the object to add it in the where, I already tried include join, but I did not succeed. Here is the index that lists the books:

    // GET: Livro
    public ActionResult Index(string sortOrder, string currentFilter, string searchString, int? page, string emailAuto, string livroAuto, string nomeAuto, string data_inicio, string data_fim, string status)
    {
        //VERIFICA PARAMETROS PARA ORDERNAR COLUNAS
        ViewBag.StatusSortParm = String.IsNullOrEmpty(sortOrder) ? "status_desc" : "";
        ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";



        if (searchString != null || emailAuto != null || livroAuto != null || nomeAuto != null)
        {
            page = 1;
        }
        else
        {
            searchString = currentFilter;
        }
        ViewBag.CurrentFilter = searchString;

        //pega usuario logado
        string userId = User.Identity.GetUserId();




        //QUERY COM FILTROS
        var query = from d in db.Livros
                        //join a in db.UsuarioEmprestimo on d.Id equals a.LivroId                            
                       // .Include(i => i.UsuarioEmprestimo)   
                        where (1 == 1)
                      select d;

        //o email de quem fez o emprestimo
        if (!String.IsNullOrEmpty(emailAuto))
        {
            //Não consigo navegar até o atributo e-mail, somente na listagem
            query = query.Where(a => a.UsuarioEmprestimo.email.Contains(emailAuto));

        }

        //funciona
        if (!String.IsNullOrEmpty(livroAuto))
        {
            query = query.Where(d => d.nome.Contains(livroAuto));
        }


        //Não consigo navegar para cria o where 
         if (!String.IsNullOrEmpty(nomeAuto))
         {
            //não funciona
             query = query.Where(d => d.UsuarioEmprestimo.nome.Contains(nomeAuto) || d.UsuarioEmprestimo.Rg.Contains(nomeAuto));
         }

         //funciona
         if (!String.IsNullOrEmpty(data_inicio) && !String.IsNullOrEmpty(data_fim))
         {
             DateTime dt_inicio = DateTime.Parse(data_inicio);
             DateTime dt_fim = DateTime.Parse(data_fim);

             query = query.Where(d => d.data_criacao >= dt_inicio && d.data_criacao <= dt_fim);
         }

         //Funciona
         if (!String.IsNullOrEmpty(status))
         {
             int statusSearch = int.Parse(status);
             query = query.Where(d => d.Status == statusSearch);
         }


           switch (sortOrder)
        {
            case "status_desc":
                query = query.OrderByDescending(s => s.Status);
                break;
            case "Date":
                query = query.OrderBy(a => a.data_criacao);
                break;
            case "date_desc":
                query = query.OrderByDescending(s => s.data_criacao);
                break;
            default:  
                query = query.OrderBy(d => d.data_criacao);
                break;
        }


        //setta paginação
        int pageSize = 10;
        int pageNumber = (page ?? 1);

        //envia pra view
        return View(query.ToPagedList(pageNumber, pageSize));


  }

I will add the two classes, I believe they are correct:

  using System;
  using System.Collections.Generic; 
  using System.ComponentModel.DataAnnotations;
  using System.ComponentModel.DataAnnotations.Schema;

 namespace Biblioteca.Models
 {
/**
 * @Class Livro
 * 
 */ 
public class Livro
{

    public Livro()
    {            
        this.Id = Guid.NewGuid();            
    }

    [Key]
    public Guid Id { get; set; }
    //[Key]
    //public int id { get; set; }

    [StringLength(255)]
    public string nome { get; set; }  
    [DataType(DataType.Date)]
    [DisplayFormat(ApplyFormatInEditMode = true)]
    public DateTime data_criacao { get; set; }

    /**
    *   Status
    * 1 = Emprestado
    * 2 = Disponivel
    * 3 = Perdido        
    */
    [Display(Name = "Status")]
    [Column("status")]
    public int Status { get; set; }

    public virtual ICollection<UsuarioEmprestimo> UsuarioEmprestimo { get; set; }

    /**
   * Status do documento
    * 1 = Emprestado
    * 2 = Disponivel
    * 3 = Perdido     
   */
    public string exibeStatus
    {
        get
        {
            string statusDocumento;
            switch (Status)
            {
                case 1:
                    statusDocumento = "Emprestado";
                    break;
                case 2:
                    statusDocumento = "Disponivel";
                    break;
                case 3:
                    statusDocumento = "Perdido";
                    break;                   
                default:
                    statusDocumento = "A Verificar";
                    break;
            }
            return statusDocumento;
        }
    }

}
}

It is worth remembering that in this case I am adding a book and it can have several people at the same time making the loan. Below is the class that I can not navigate in where:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace Biblioteca.Models
{
public class UsuarioEmprestimo
{
    public UsuarioEmprestimo()
    {           
        this.Id = Guid.NewGuid();

    }


    [Key]
    public Guid Id { get; set; }

    [Display(Name = "Data Criação")]
    [DataType(DataType.Date)]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
    public DateTime data_criacao { get; set; }

    [DataType(DataType.Date)]
    public DateTime? data_entrega { get; set; }     

    [Display(Name = "Nome")]
    [Required(ErrorMessage = "Por favor, preencher o campo nome.")]
    [StringLength(200)]
    [MaxLength(200)]
    [Index("UsuarioEmprestimo1_Index", IsClustered = false)]
    public string nome { get; set; }

    [Display(Name = "RG")]
    //[Required(ErrorMessage = "Por favor, preencher o campo RG.")]
    [MaxLength(15)]
    [Index("Usuario_Emprestimo_Index3", IsClustered = false)]
    [StringLength(15)]
    public string Rg { get; set; }

    [Display(Name = "E-mail")]
    [DataType(DataType.EmailAddress)]
    [MaxLength(200)]
    [Index("Usuario_Emprestimo_EmailIndex9", IsClustered = false)]
    [StringLength(200)]
    public string email { get; set; }

    /**
    * Status 
    * 1 = Emprestimo
    * 2 = Entregue   
    * 3 = Não devolveu
    */       
    public int Status { get; set; }    

    [Column("livro_id")]
    public Guid LivroId { get; set; }

    [ForeignKey("LivroId")]
    public virtual Livro Livro { get; set; }  

}
}

What would be the correct way to solve the problem with the filters

if (!String.IsNullOrEmpty(emailAuto)){
//Não consigo navegar até o atributo e-mail
query = query.Where(a => a.UsuarioEmprestimo.email.Contains(emailAuto));

        }
    
asked by anonymous 03.02.2016 / 13:50

1 answer

0

Using Anywhere where apparently solved the problem. follows the code snippet:

if (!String.IsNullOrEmpty(emailAuto)){
      query = query.Where(a => a.UsuarioEmprestimo.Any(a=>a.email.Contains(emailAuto)));

    }
    
04.02.2016 / 14:17