KeyInfo GetKey() { if (this.ApiFilter != null) { var keys = Resource.GetRecordInfo(typeof(TRecord)).Keys; var maxKeySegmentCount = keys.Max(k => k.Segments.Count); IEnumerable <KeyInfo> enabledKeys = keys, remainedKeys = new KeyInfo[0]; var enabledKeyList = new List <KeyInfo>(); var priorityList = new List <uint>(); var fields = this.ApiFilter .SelectMany(filter => filter.GetFields().Select(field => new { State = filter.State, Field = field })) .GroupBy(f => f.Field) .Select(g => new { Field = g.Key, Priority = GetPriority(g.Select(f => f.State)) }); for (var i = 0; i < maxKeySegmentCount; i++) { uint priority = 0; foreach (var key in enabledKeys) { var field = fields.SingleOrDefault(f => f.Field == key.Segments[i].Field); if (field != null) { if (field.Priority == priority) { enabledKeyList.Add(key); } else if (field.Priority > priority) { priority = field.Priority; enabledKeyList.Clear(); enabledKeyList.Add(key); } } } if (enabledKeyList.Count == 0) { if (remainedKeys.Count() == 0) { remainedKeys = enabledKeys.Where(k => i == k.Segments.Count - 1).ToArray(); } enabledKeys = enabledKeys.Where(k => i != k.Segments.Count - 1).ToArray(); } else if (enabledKeyList.Count == 1) { return(enabledKeyList[0]); } else if (enabledKeyList.Count > 1) { enabledKeys = enabledKeyList.Where(k => i != k.Segments.Count - 1).ToArray(); remainedKeys = enabledKeyList.Where(k => i == k.Segments.Count - 1).ToArray(); } enabledKeyList.Clear(); priorityList.Add(priority); } if (priorityList.Any(p => p != 0)) { return(remainedKeys.FirstOrDefault() ?? enabledKeys.FirstOrDefault()); } else { return(null); } } return(null); }