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