public async Task <IActionResult> GetMatchList(int?id) { if (id == null) { return(NotFound()); } //Recolher dados estatisticos do Match feito anteriormente. var matchStatsInfoDb = _context.MatchStats.ToList(); var matchStatsInfo = new MatchStatsInfo { //NrRecords = matchStatsInfoDb.Count(), GrupoSanguineoMulher = matchStatsInfoDb.Count(x => x.GrupoSanguineoMulher), GrupoSanguineoHomem = matchStatsInfoDb.Count(x => x.GrupoSanguineoHomem), CorOlhosMulher = matchStatsInfoDb.Count(x => x.CorOlhosMulher), CorCabeloMulher = matchStatsInfoDb.Count(x => x.CorCabeloMulher), RacaHomem = matchStatsInfoDb.Count(x => x.RacaHomem), CorPeleMulher = matchStatsInfoDb.Count(x => x.CorPeleMulher), CorOlhosHomem = matchStatsInfoDb.Count(x => x.CorOlhosHomem), CorCabeloHomem = matchStatsInfoDb.Count(x => x.CorCabeloHomem), CorPeleHomem = matchStatsInfoDb.Count(x => x.CorPeleHomem), TexturaCabeloHomem = matchStatsInfoDb.Count(x => x.TexturaCabeloHomem), TexturaCabeloMulher = matchStatsInfoDb.Count(x => x.TexturaCabeloMulher), RacaMulher = matchStatsInfoDb.Count(x => x.RacaMulher), }; //Recolher dados do casal e lista de dadores filtrados com factor de exclusao var casal = _context.Casal.FirstOrDefault(x => x.CasalID == id); var matchList = _context.Dador .Where(x => x.Amostras.Any(y => y.PedidoGametas == null)) .Where(x => casal.GamMatch(x)) .ToList(); //Mecanismo de ordenação baseada nas escolhas frequentes do utilizador var listaOrdenada = MatchHelper.GetOrdedList(matchList, casal, matchStatsInfo); if (!listaOrdenada.Any()) { casal.PedidoGametas.EstadoProcessoPedido = EstadoProcesso.EmListaEspera; //TODO apresentar mensagem utilizador de "sem match possiveis de momento" return(NotFound()); } ViewBag.CasalId = id; return(View("ListaDadores", listaOrdenada)); }
/// <summary> /// Ordena lista segundo uma preferencia MatchStatsInfo /// </summary> /// <param name="dadors">lista de dadores (compativeis)</param> /// <param name="casal">casal selecionado</param> /// <param name="stats">dados preferenciais</param> /// <returns>Lista ordenada de compatibilidades</returns> public static List <Dador> GetOrdedList(List <Dador> dadors, Casal casal, MatchStatsInfo stats) { var listaComparacao = dadors.Select(x => new { x.DadorId, GrupoSanguineoMulher = casal.GrupoSanguineoMulher == x.GrupoSanguineo, GrupoSanguineoHomem = casal.GrupoSanguineoHomem == x.GrupoSanguineo, CorCabeloHomem = casal.CorCabeloHomem == x.CorCabelo, CorCabeloMulher = casal.CorCabeloMulher == x.CorCabelo, CorOlhosHomem = casal.CorOlhosHomem == x.CorOlhos, CorOlhosMulher = casal.CorOlhosMulher == x.CorOlhos, CorPeleHomem = casal.CorPeleHomem == x.CorPele, CorPeleMulher = casal.CorPeleMulher == x.CorPele, RacaHomem = casal.RacaHomem == x.Etnia, RacaMulher = casal.RacaHomem == x.Etnia, TexturaCabeloHomem = casal.TexturaCabeloHomem == x.TexturaCabelo, TexturaCabeloMulher = casal.TexturaCabeloMulher == x.TexturaCabelo //DUMMY //CorCabeloHomem =false, //CorCabeloMulher = false, //CorOlhosHomem = false, //CorOlhosMulher = false, //CorPeleHomem = false, //CorPeleMulher = false, //RacaHomem = false, //RacaMulher = false, //TexturaCabeloHomem = false, //TexturaCabeloMulher = false }); var ordemStats = stats.GetType().GetProperties().Select(x => new { Field = x.Name, Value = x.GetValue(stats, null) }).OrderBy(x => x.Value).Select(x => x.Field).ToList().Aggregate((x, y) => $"{x},{y}"); var comparacaoOrdenada = System.Linq.Dynamic.Core.DynamicQueryableExtensions.OrderBy(listaComparacao.AsQueryable(), ordemStats); //var comparacaoOrdenada = listaComparacao.OrderBy(ordemStats); var sortedList = comparacaoOrdenada.Select(x => dadors.FirstOrDefault(y => x.DadorId == y.DadorId)).ToList(); return(sortedList); }