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