/// <summary> /// Get list of dictionary records rated and ordered in dependence to this instance's criteria /// </summary> /// <returns>List of dictionary articles to show user</returns> public IEnumerable <ClassesRecord> GetDataset() { string ds = icd; if (!Diagnoses.Contains(icd)) { ds = string.Empty; } var query = from ss in model.Stages.All join ts in model.Tumors.All on ss.Diagnosis equals ts.Diagnosis join ns in model.Nodules.All on ss.Diagnosis equals ns.Diagnosis join ms in model.Metastases.All on ss.Diagnosis equals ms.Diagnosis where ss.Diagnosis == ds select new ClassesRecord { ID = 0, Diagnosis = ts.Diagnosis, Stage = ss.Code, StageArabic = ss.CodeArabic, Tumor = ts.Code, Nodus = ns.Code, Metastasis = ms.Code, Code = ClassesRecord.GetCode(ss.ID, ts.ID, ns.ID, ms.ID) }; maxRating = 0; var result = query.ToList(); result.ForEach(rec => rec.Rating = CountRating(rec)); return(result.OrderByDescending(r => r.Rating).Take(50)); }
/// <summary> /// Correlation rating counter /// </summary> /// <param name="rec">Classification dictionary record to rate against this instance</param> /// <returns>Affinity rating: the bigger the rating, the more the record matches this instance's criteria</returns> int CountRating(ClassesRecord rec) { int result = 0; if (stageArabic == rec.StageArabic) { // Exact match criterium weighs more result += MINOR_MATCH_RATING; } else if (rec.StageArabic.StartsWith(stageArabic)) { // Not precise match weighs less ++result; } if (tumor == rec.Tumor) { result += MATCH_RATING; } else if (rec.Tumor.StartsWith(tumor)) { ++result; } // Noduli and metastases are more valuable than say stage if (nodus == rec.Nodus) { result += MATCH_RATING; } else if (rec.Nodus.StartsWith(nodus)) { result += MINOR_MATCH_RATING; } if (mts == rec.Metastasis) { result += MATCH_RATING; } else if (rec.Metastasis.StartsWith(mts)) { result += MATCH_RATING; } if (maxRating < result) { maxRating = result; } return(result); }