Exemple #1
0
        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);
        }