Beispiel #1
0
        /// <summary>
        /// gets list of criterionweights which the user should fill out
        /// </summary>
        /// <param name="issueId"></param>
        /// <param name="userId">user who is performing the operation</param>
        /// <returns></returns>
        public static List <CriterionWeight> GetEmptyWeights(int issueId, int userId)
        {
            CriterionWeight        cw;
            ApplicationDBEntities  ctx  = new ApplicationDBEntities();
            List <CriterionWeight> list = new List <CriterionWeight>();

            var query = from Criterion in ctx.Criterion
                        where
                        Criterion.Issue == issueId
                        select new
            {
                Id          = Criterion.Id,
                Name        = Criterion.Name,
                Description = Criterion.Description,
                Issue       = Criterion.Issue,
                Weight      = Criterion.Weight,
                WeightPC    = Criterion.WeightPC
            };

            foreach (var c in query.AsNoTracking())
            {
                cw             = new CriterionWeight();
                cw.CriterionId = c.Id;
                cw.UserId      = userId;
                cw.Weight      = 0.0;
                list.Add(cw);
            }

            ctx.Dispose();

            return(list);
        }
Beispiel #2
0
        /// <summary>
        /// returns all criterionweights of an Issue
        /// </summary>
        /// <param name="issueId"></param>
        /// <param name="userId">user who is performing this operation</param>
        /// <returns></returns>
        public static List <CriterionWeight> GetIssueWeights(int issueId, int userId)
        {
            List <CriterionWeight> list = new List <CriterionWeight>();
            CriterionWeight        cw;
            ApplicationDBEntities  ctx = new ApplicationDBEntities();

            var query = from CriterionWeight in ctx.CriterionWeight
                        where
                        (from Criterion in ctx.Criterion
                         where
                         Criterion.Issue == issueId
                         select new
            {
                Criterion.Id
            }).Contains(new { Id = CriterionWeight.CriterionId })
                        select new
            {
                UserId      = CriterionWeight.UserId,
                CriterionId = CriterionWeight.CriterionId,
                Weight      = CriterionWeight.Weight
            };

            foreach (var c in query.AsNoTracking())
            {
                cw             = new CriterionWeight();
                cw.CriterionId = c.CriterionId;
                cw.Weight      = c.Weight;
                cw.UserId      = c.UserId;
                list.Add(cw);
            }

            ctx.Dispose();

            return(list);
        }
Beispiel #3
0
        /// <summary>
        /// tries to save criteria weight comparisons
        /// </summary>
        /// <param name="list">list of comparisons to be saved</param>
        /// <returns>returns true if consistency check OK and save is performed
        /// if consistency check faild returns false</returns>
        public static List <CriterionWeight> SaveWeightComparison(List <PairwiseComparisonCC> list)
        {
            List <CriterionWeight> criteriaWeights = new List <CriterionWeight>();

            if (list == null || list.Count == 0)
            {
                return(criteriaWeights);
            }

            //first check if user has made comparisons
            //if true then delete old comparisons
            ApplicationDBEntities ctx = new ApplicationDBEntities();
            int    issueId            = ctx.Criterion.Find(list[0].CriterionLeft).Issue;
            int    userId             = list[0].UserId;
            string sqlQuery           = "SELECT COUNT(*) FROM PairwiseComparisonCC WHERE UserId = {0} AND CriterionLeft IN (SELECT Id From Criterion Where Issue = {1})";

            if (ctx.Database.SqlQuery <int>(sqlQuery, userId, issueId).FirstOrDefault() > 0)
            {
                sqlQuery = "DELETE FROM PairwiseComparisonCC WHERE UserId = {0} AND CriterionLeft IN (SELECT Id From Criterion Where Issue = {1})";
                ctx.Database.ExecuteSqlCommand(sqlQuery, userId, issueId);
                sqlQuery = "DELETE FROM CriterionWeight WHERE UserId = {0} AND CriterionId IN (SELECT Id From Criterion Where Issue = {1})";
                ctx.Database.ExecuteSqlCommand(sqlQuery, userId, issueId);
                ctx.SaveChanges();
            }

            sqlQuery = "SELECT Count(*) From Criterion Where Issue = {0}";
            int critCnt = ctx.Database.SqlQuery <int>(sqlQuery, issueId).FirstOrDefault();

            //sort comparisons
            list = list.OrderBy(x => x.CriterionLeft).ThenBy(x => x.CriterionRight).ToList();

            //create reciprocal matrix
            Matrix <double> critMatrix = Matrix <double> .Build.Dense(critCnt, critCnt, 1.0);

            int i = 0;
            int j = 1;

            foreach (var pcc in list)
            {
                if (j == critCnt)
                {
                    i++;
                    j = i + 1;
                }
                critMatrix[i, j] = pcc.Value;
                critMatrix[j, i] = 1.0 / pcc.Value;

                j++;
            }

            //if consistency check ok insert criterion weights
            if (AhpConsistency(critMatrix))
            {
                foreach (var pcc in list)
                {
                    ctx.PairwiseComparisonCC.Add(pcc);
                    ctx.Entry(pcc).State = System.Data.Entity.EntityState.Added;
                }
                ctx.SaveChanges();

                Vector <double>  priorityWeightVector = Eigenvector(critMatrix);
                List <Criterion> cList = ctx.Criterion.Where(x => x.Issue == issueId).OrderBy(x => x.Id).ToList();
                CriterionWeight  cw;
                i = 0;
                foreach (Criterion c in cList)
                {
                    cw             = new CriterionWeight();
                    cw.UserId      = userId;
                    cw.CriterionId = c.Id;
                    cw.Weight      = priorityWeightVector[i];
                    ctx.CriterionWeight.Add(cw);
                    ctx.Entry(cw).State = System.Data.Entity.EntityState.Added;
                    criteriaWeights.Add(cw);
                    i++;
                }
                ctx.SaveChanges();

                ctx.Dispose();
            }
            return(criteriaWeights);
        }