using System; using System.Data; using Entidades; using Entidades.Admin; using Entidades.Dto; using Microsoft.EntityFrameworkCore; using Microsoft.Identity.Client; using Modelo; using MySql.Data.MySqlClient; public class RepositorioPropiedades : RepositorioBase { public IQueryable ListarPropiedades() { FormattableString sqlq = $""" SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, p.iddivisa as Iddivisa FROM Propiedades p JOIN EstadoPropiedad ep ON p.idestado = 1 JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad JOIN Servicios s on sp.idServicio =s.id GROUP BY p.id """; var ret = Context.Database.SqlQuery(sqlq); return ret; } public Propiedade? ObtenerPropiedadPorId(int Id) { var con = Context; Propiedade? prop = con.Propiedades.Include(x => x.DnipropietarioNavigation).FirstOrDefault(x => x.Id == Id); if (prop == null || prop.Id == 0) { return null; } return prop; } public bool AñadirPropiedad(Propiedade? prop, long dni = 0) { if (prop == null) return false; var con = Context; if (string.IsNullOrEmpty(prop.Letra)) prop.Letra = "_"; prop.Id = (con.Propiedades.Count()!=0) ? con.Propiedades.Count() + 1 : 1; prop.Idestado = 1; var a = con.Divisas.ToList(); Console.WriteLine($"Id: {prop.Id}"); Console.WriteLine($"Ubicacion: {prop.Ubicacion}"); Console.WriteLine($"Cant. Habitaciones: {prop.Canthabitaciones}"); Console.WriteLine($"PROPiso: {prop.Piso}"); Console.WriteLine($"Letra: {prop.Letra}"); Console.WriteLine($"DNI PROPropietario: {prop.Dnipropietario}"); Console.WriteLine($"Id Tipropo Propiedad: {prop.Idtipropiedad}"); Console.WriteLine($"Id Estado: {prop.Idestado}"); Console.WriteLine($"Monto: {prop.Monto}"); Console.WriteLine($"Id Divisa: {prop.Iddivisa}"); con.Propiedades.Add(prop); if (dni!=0) GenerarLog(con, dni, $"Se guardo la propiedad"); return Guardar(con); /* var filasInsertadasParam = new MySqlParameter("@p_filas_insertadas", SqlDbType.Int) { Direction = ParameterDirection.Output }; // Ejecutar el procedimiento almacenado var row = con.Database.ExecuteSqlRaw( $""" CALL InsertarPropiedad(@p_ubicacion, @p_cant_habitaciones, @p_piso, @p_letra, @p_dni_propietario, @p_id_tipo_propiedad, @p_monto, @iddivisa, @p_filas_insertadas) """, new MySqlParameter("@p_ubicacion", prop.Ubicacion), new MySqlParameter("@p_cant_habitaciones", prop.Canthabitaciones), new MySqlParameter("@p_piso", prop.Piso), new MySqlParameter("@p_letra", prop.Letra), new MySqlParameter("@p_dni_propietario", prop.Dnipropietario), new MySqlParameter("@p_id_tipo_propiedad", prop.Idtipropiedad), new MySqlParameter("@p_monto", prop.Monto), new MySqlParameter("@iddivisa", prop.Iddivisa), filasInsertadasParam ); return (int)filasInsertadasParam.Value == 1 ? true : false; */ } public bool PatchPropiedad(Propiedade prop, long dni) { var con = Context; Propiedade? propi = con.Propiedades.Include(x => x.IdServicios).FirstOrDefault(x => x.Id == prop.Id); if (propi == null) return false; propi.Canthabitaciones = prop.Canthabitaciones; propi.Idtipropiedad = prop.Idtipropiedad; propi.Ubicacion = prop.Ubicacion; propi.Piso = prop.Piso; propi.Letra = prop.Letra; propi.Monto = prop.Monto; propi.Iddivisa = prop.Iddivisa; propi.IdServicios.Clear(); foreach (Servicio ser in prop.IdServicios) { var servi = con.Servicios.FirstOrDefault(x => x.Id == ser.Id); if (servi == null) return false; propi.IdServicios.Add(servi); } GenerarLog(con, dni, $"Se modificó: {prop.Id}"); return Guardar(con); } public IQueryable ObtenerPropiedadesPorEmail(string email) { FormattableString sqlq = $""" SELECT p.id, p.ubicacion as Ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion as Tipo, GROUP_CONCAT(IFNULL(s.descripcion, '') SEPARATOR ', ') AS Servicios, p.monto as Monto, p.iddivisa as Iddivisa FROM Propiedades p JOIN Clientes c ON c.dni = p.dnipropietario JOIN TipoPropiedad tp ON tp.id = p.idtipropiedad LEFT JOIN Servicio_Propiedad ps ON ps.idPropiedad = p.id LEFT JOIN Servicios s ON s.Id = ps.idServicio WHERE c.email = {email} AND p.idestado = 1 GROUP BY p.id """; var ret = Context.Database.SqlQuery(sqlq); return ret; } public IQueryable ObtenerPropiedadesDeBajaPorEmail(string email) { FormattableString sqlq = $""" SELECT p.id, p.ubicacion as Ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion as Tipo, GROUP_CONCAT(IFNULL(s.descripcion, '') SEPARATOR ', ') AS Servicios, p.monto as Monto, p.iddivisa as Iddivisa FROM Propiedades p JOIN Clientes c ON c.dni = p.dnipropietario JOIN TipoPropiedad tp ON tp.id = p.idtipropiedad LEFT JOIN Servicio_Propiedad ps ON ps.idPropiedad = p.id LEFT JOIN Servicios s ON s.Id = ps.idServicio WHERE c.email = {email} AND p.idestado = 3 GROUP BY p.id """; var ret = Context.Database.SqlQuery(sqlq); return ret; } public bool AñadirServicioAPropiedad(int idprop, List idserv) { var con = Context; Propiedade? prop = con.Propiedades.Find(idprop); if (prop == null) return false; foreach (int id in idserv) { Servicio? servicio = con.Servicios.Find(id); if (servicio == null) return false; prop.IdServicios.Add(servicio); } return Guardar(con); } public bool BajaPropiedad(int id, Cliente? cli) { if (cli == null) return false; var con = Context; Propiedade? prop = con.Propiedades.FirstOrDefault(x => x.Id == id); if (prop == null) return false; if (prop.Dnipropietario != cli.Dni) return false; if (prop.Idestado == 1) { prop.Idestado = 3; } else { prop.Idestado = 1; } GenerarLog(con, cli.Dni, $"Baja propiedad: {prop.Id}"); return Guardar(con); } public bool BajaPropiedad(int id, long dni) { var con = Context; Propiedade? prop = con.Propiedades.FirstOrDefault(x => x.Id == id); if (prop == null || prop.Dnipropietario == 0) return false; prop.Idestado = prop.Idestado == 3 ? 1 : 3; GenerarLog(con, dni, $"Baja propiedad: {prop.Id}"); return Guardar(con); } public bool BajaServiciosAPropiedad(int idprop, List idserv, long dni) { var con = Context; Propiedade? prop = con.Propiedades.Include(x => x.IdServicios).FirstOrDefault(x => x.Id == idprop); if (prop == null) return false; foreach (int id in idserv) { Servicio? servicio = con.Servicios.Find(id); if (servicio == null) return false; if (prop.IdServicios.Contains(servicio)) { prop.IdServicios.Remove(servicio); } } GenerarLog(con, dni, $"Baja servicios a propiedad: {prop.Id}"); return Guardar(con); } public IQueryable ObtenerPropiedesPorHabitaciones_Tipo_Servicios(int habitaciones, int tipo, string servicios) { string serviciosEscapados = string.Join(",", servicios.Split(',').Select(s => s.Trim())); FormattableString sqlq = $""" SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, p.iddivisa as Iddivisa FROM Propiedades p JOIN EstadoPropiedad ep ON p.idestado = 1 JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad JOIN Servicios s on sp.idServicio =s.id WHERE p.canthabitaciones = {habitaciones} AND p.idtipropiedad = {tipo} AND EXISTS ( SELECT 1 FROM Servicio_Propiedad sp2 JOIN Servicios s2 ON sp2.idServicio = s2.id WHERE sp2.idPropiedad = p.id AND FIND_IN_SET(s2.descripcion, {serviciosEscapados}) ) GROUP BY p.id """; var ret = Context.Database.SqlQuery(sqlq); return ret; } public IQueryable ObtenerPropiedesPorHabitaciones_Tipo(int cantidadHabitaciones, int tipoPropiedad) { FormattableString sqlq = $""" SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, p.iddivisa as Iddivisa FROM Propiedades p JOIN EstadoPropiedad ep ON p.idestado = 1 JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad JOIN Servicios s on sp.idServicio =s.id WHERE p.canthabitaciones = {cantidadHabitaciones} AND p.idtipropiedad = {tipoPropiedad} GROUP BY p.id """; var ret = Context.Database.SqlQuery(sqlq); return ret; } public IQueryable ObtenerPropiedesPorServicios(string servicios) { string serviciosEscapados = string.Join(",", servicios.Split(',').Select(s => s.Trim())); FormattableString sqlq = $""" SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, p.iddivisa as Iddivisa FROM Propiedades p JOIN EstadoPropiedad ep ON p.idestado = 1 JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad JOIN Servicios s on sp.idServicio =s.id WHERE EXISTS ( SELECT 1 FROM Servicio_Propiedad sp2 JOIN Servicios s2 ON sp2.idServicio = s2.id WHERE sp2.idPropiedad = p.id AND FIND_IN_SET(s2.descripcion, {serviciosEscapados}) ) GROUP BY p.id """; var ret = Context.Database.SqlQuery(sqlq); return ret; } public IQueryable ObtenerPropiedesPorHabitaciones(int cantidadHabitaciones) { FormattableString sqlq = $""" SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, p.iddivisa as Iddivisa FROM Propiedades p JOIN EstadoPropiedad ep ON p.idestado = 1 JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad JOIN Servicios s on sp.idServicio =s.id WHERE p.canthabitaciones = {cantidadHabitaciones} GROUP BY p.id """; var ret = Context.Database.SqlQuery(sqlq); return ret; } public IQueryable ObtenerPropiedesPorTipo(int tipoPropiedad) { FormattableString sqlq = $""" SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, p.iddivisa as Iddivisa FROM Propiedades p JOIN EstadoPropiedad ep ON p.idestado = 1 JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad JOIN Servicios s on sp.idServicio =s.id WHERE p.idtipropiedad = {tipoPropiedad} GROUP BY p.id """; var ret = Context.Database.SqlQuery(sqlq); return ret; } public IQueryable ObtenerPropiedesPorHabitaciones_Servicios(int cantidadHabitaciones, string servicios) { string serviciosEscapados = string.Join(",", servicios.Split(',').Select(s => s.Trim())); FormattableString sqlq = $""" SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, p.iddivisa as Iddivisa FROM Propiedades p JOIN EstadoPropiedad ep ON p.idestado = 1 JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad JOIN Servicios s on sp.idServicio =s.id WHERE p.canthabitaciones = {cantidadHabitaciones} AND EXISTS ( SELECT 1 FROM Servicio_Propiedad sp2 JOIN Servicios s2 ON sp2.idServicio = s2.id WHERE sp2.idPropiedad = p.id AND FIND_IN_SET(s2.descripcion, {serviciosEscapados}) ) GROUP BY p.id """; var ret = Context.Database.SqlQuery(sqlq); return ret; } public IQueryable ObtenerPropiedesPorTipo_Servicios(int tipoPropiedad, string servicios) { string serviciosEscapados = string.Join(",", servicios.Split(',').Select(s => s.Trim())); FormattableString sqlq = $""" SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, p.iddivisa as Iddivisa FROM Propiedades p JOIN EstadoPropiedad ep ON p.idestado = 1 JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad JOIN Servicios s on sp.idServicio =s.id WHERE p.idtipropiedad = {tipoPropiedad} AND EXISTS ( SELECT 1 FROM Servicio_Propiedad sp2 JOIN Servicios s2 ON sp2.idServicio = s2.id WHERE sp2.idPropiedad = p.id AND FIND_IN_SET(s2.descripcion, {serviciosEscapados}) ) GROUP BY p.id """; var ret = Context.Database.SqlQuery(sqlq); return ret; } public bool BajaPropiedades(string email) { var con = Context; try { IQueryable listprop = con.Propiedades.Where(x => x.DnipropietarioNavigation.Email == email); foreach (var item in listprop) { item.Idestado = 3; } } catch { return false; } return Guardar(con); } public IQueryable ListarPropiedadesPorPagina(int pag) { FormattableString sqlq = $""" SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, p.iddivisa as Iddivisa FROM Propiedades p JOIN EstadoPropiedad ep ON p.idestado = 1 JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad JOIN Servicios s on sp.idServicio =s.id GROUP BY p.id LIMIT 10 OFFSET {pag * 10} """; var ret = Context.Database.SqlQuery(sqlq); return ret; } ///////////////ADMIN public IQueryable ListarPropiedadesPorPaginaAdmin(int pag) { FormattableString sqlq = $""" SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, ep.descripcion AS Estado, p.iddivisa as Iddivisa FROM Propiedades p JOIN EstadoPropiedad ep ON p.idestado = ep.id JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad JOIN Servicios s on sp.idServicio =s.id GROUP BY p.id LIMIT 10 OFFSET {pag * 10} """; var ret = Singleton.Context.Database.SqlQuery(sqlq); return ret; } public IQueryable ObtenerPropiedesPorHabitacionesPaginado(int cantidadHabitaciones, int pag) { FormattableString sqlq = $""" SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, ep.descripcion AS Estado, p.iddivisa as Iddivisa FROM Propiedades p JOIN EstadoPropiedad ep ON p.idestado = ep.id JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad JOIN Servicios s on sp.idServicio =s.id WHERE p.canthabitaciones = {cantidadHabitaciones} GROUP BY p.id LIMIT 10 OFFSET {pag * 10} """; var ret = Singleton.Context.Database.SqlQuery(sqlq); return ret; } public IQueryable ObtenerPropiedesPorTipoPaginado(int tipoPropiedad, int pag) { FormattableString sqlq = $""" SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, ep.descripcion AS Estado, p.iddivisa as Iddivisa FROM Propiedades p JOIN EstadoPropiedad ep ON p.idestado = ep.id JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad JOIN Servicios s on sp.idServicio =s.id WHERE p.idtipropiedad = {tipoPropiedad} GROUP BY p.id LIMIT 10 OFFSET {pag * 10} """; var ret = Singleton.Context.Database.SqlQuery(sqlq); return ret; } public IQueryable ObtenerPropiedesPorHabitaciones_TipoPaginado(int cantidadHabitaciones, int tipoPropiedad, int pag) { FormattableString sqlq = $""" SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, ep.descripcion AS Estado, p.iddivisa as Iddivisa FROM Propiedades p JOIN EstadoPropiedad ep ON p.idestado = ep.id JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad JOIN Servicios s on sp.idServicio =s.id WHERE p.canthabitaciones = {cantidadHabitaciones} AND p.idtipropiedad = {tipoPropiedad} GROUP BY p.id LIMIT 10 OFFSET {pag * 10} """; var ret = Singleton.Context.Database.SqlQuery(sqlq); return ret; } public IQueryable ObtenerPropiedesPorServiciosPaginado(string servicios, int pag) { string serviciosEscapados = string.Join(",", servicios.Split(',').Select(s => s.Trim())); FormattableString sqlq = $""" SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, ep.descripcion AS Estado, p.iddivisa as Iddivisa FROM Propiedades p JOIN EstadoPropiedad ep ON p.idestado = ep.id JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad JOIN Servicios s on sp.idServicio =s.id WHERE EXISTS ( SELECT 1 FROM Servicio_Propiedad sp2 JOIN Servicios s2 ON sp2.idServicio = s2.id WHERE sp2.idPropiedad = p.id AND FIND_IN_SET(s2.descripcion, {serviciosEscapados}) ) GROUP BY p.id LIMIT 10 OFFSET {pag * 10} """; var ret = Singleton.Context.Database.SqlQuery(sqlq); return ret; } public IQueryable ObtenerPropiedesPorHabitaciones_Servicios_Paginado(int cantidadHabitaciones, string servicios, int pag) { string serviciosEscapados = string.Join(",", servicios.Split(',').Select(s => s.Trim())); FormattableString sqlq = $""" SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, ep.descripcion AS Estado, p.iddivisa as Iddivisa FROM Propiedades p JOIN EstadoPropiedad ep ON p.idestado = ep.id JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad JOIN Servicios s on sp.idServicio =s.id WHERE p.canthabitaciones = {cantidadHabitaciones} AND EXISTS ( SELECT 1 FROM Servicio_Propiedad sp2 JOIN Servicios s2 ON sp2.idServicio = s2.id WHERE sp2.idPropiedad = p.id AND FIND_IN_SET(s2.descripcion, {serviciosEscapados}) ) GROUP BY p.id LIMIT 10 OFFSET {pag * 10} """; var ret = Singleton.Context.Database.SqlQuery(sqlq); return ret; } public IQueryable ObtenerPropiedesPorTipo_Servicios_Paginado(int tipoPropiedad, string servicios, int pag) { string serviciosEscapados = string.Join(",", servicios.Split(',').Select(s => s.Trim())); FormattableString sqlq = $""" SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, ep.descripcion AS Estado, p.iddivisa as Iddivisa FROM Propiedades p JOIN EstadoPropiedad ep ON p.idestado = ep.id JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad JOIN Servicios s on sp.idServicio =s.id WHERE p.idtipropiedad = {tipoPropiedad} AND EXISTS ( SELECT 1 FROM Servicio_Propiedad sp2 JOIN Servicios s2 ON sp2.idServicio = s2.id WHERE sp2.idPropiedad = p.id AND FIND_IN_SET(s2.descripcion, {serviciosEscapados}) ) GROUP BY p.id LIMIT 10 OFFSET {pag * 10} """; var ret = Singleton.Context.Database.SqlQuery(sqlq); return ret; } public IQueryable ObtenerPropiedesPorHabitaciones_Tipo_Servicios_Paginado(int habitaciones, int tipo, string servicios, int pag) { string serviciosEscapados = string.Join(",", servicios.Split(',').Select(s => s.Trim())); FormattableString sqlq = $""" SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, ep.descripcion AS Estado, p.iddivisa as Iddivisa FROM Propiedades p JOIN EstadoPropiedad ep ON p.idestado = ep.id JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id JOIN Servicio_Propiedad sp on p.id =sp.idPropiedad JOIN Servicios s on sp.idServicio =s.id WHERE p.canthabitaciones = {habitaciones} AND p.idtipropiedad = {tipo} AND EXISTS ( SELECT 1 FROM Servicio_Propiedad sp2 JOIN Servicios s2 ON sp2.idServicio = s2.id WHERE sp2.idPropiedad = p.id AND FIND_IN_SET(s2.descripcion, {serviciosEscapados}) ) GROUP BY p.id LIMIT 10 OFFSET {pag * 10} """; var ret = Singleton.Context.Database.SqlQuery(sqlq); return ret; } public int CuantasPaginas(int estado = 0) { var con = Context; double inter; int ret; if (estado == 0) { inter = con.Propiedades.Count() / 10.0; } else { inter = con.Propiedades.Where(x => x.Idestado == estado).Count(); } if (inter == 0.00) return 0; ret = (int)Math.Ceiling(inter); return ret; } public int CuantasPaginasBusqueda(int habitaciones, string servicios, int tipoPropiedad, int estado) { int registrosPorPagina = 10; var query = Context.Propiedades .Include(p => p.IdestadoNavigation) .Include(p => p.IdtipropiedadNavigation) .Include(p => p.IdServicios) .AsQueryable(); if (habitaciones > 0) { query = query.Where(p => p.Canthabitaciones == habitaciones); } if (estado > 0) { query = query.Where(x => x.Idestado == estado); } if (tipoPropiedad > 0) { query = query.Where(p => p.Idtipropiedad == tipoPropiedad); } if (!string.IsNullOrWhiteSpace(servicios)) { var listaServicios = servicios.Split(',').Select(s => s.Trim()).ToList(); query = query.Where(p => p.IdServicios.Any(sp => listaServicios.Contains(sp.Descripcion))); } int totalRegistros = query.Distinct().Count(); return (int)Math.Ceiling((double)totalRegistros / registrosPorPagina); } public IQueryable? ObtenerPropiedadesEnVenta(int pag) { var con = Context; var props = con.Propiedades.Include(x => x.IdServicios).Include(x => x.IddivisaNavigation) .Include(c => c.IdtipropiedadNavigation) .Where(x => x.Idestado == 4 && !x.Venta.Any(x => x.Idestado == 2)) .Skip(pag * 10).Take(10); return props; } public int ObtenerPaginasDePropiedadesEnVenta() { var con = Context; var props = con.Propiedades.Where(x => x.Idestado == 4 && !x.Venta.Any(x => x.Idestado == 2)).Count(); return (int)Math.Ceiling((double)props / 10); } public IQueryable ObtenerPropiedadesAVentaPorDni(long dni) { var con = Context; var l = con.Propiedades.Include(x => x.IdServicios).Include(x => x.IdtipropiedadNavigation) .Where(x => x.Dnipropietario == dni && x.Idestado == 4); return l; } }