internal static QueryDefinitionInfo Convert(QueryDefinition query) { var result = new QueryDefinitionInfo { Target = query.Target, Properties = query.Properties.Select(x => new KeyValuePair <AttributeInfo, AttributeInfo>( new AttributeInfo { Content = Normalize(string.Join(" ", x.Key.Select(w => w.Content))) }, new AttributeInfo { Content = Normalize(string.Join(" ", x.Value.Select(w => w.Content))), Type = x.Value.Type, Hint = x.Value.Hint, })) .ToList() }; return(result); }
public static IEnumerable <Certificate> Find(QueryDefinitionInfo query) { var result = new List <Certificate>(); var cache = new Dictionary <CertificateKind, IDictionary <string, PropertyInfo> >(); if (query.Target == null) { return(Enumerable.Empty <Certificate>()); } if (query.Properties.IsEmpty()) { return(_certificates.Where(x => "{0}".ToInvariantFormat(x.Kind).ToLowerInvariant().OrdinalEquals(query.Target.ToLowerInvariant())).ToList()); } foreach (var item in _certificates) { if ("{0}".ToInvariantFormat(item.Kind).ToLowerInvariant().OrdinalEquals(query.Target.ToLowerInvariant()) == false) { continue; } if (cache.ContainsKey(item.Kind) == false) { cache[item.Kind] = item.GetType() .GetProperties(BindingFlags.Instance | BindingFlags.Public) .ToDictionary(x => x.Name.ToLowerInvariant(), x => x); } bool canAdd = true; foreach (var attribute in query.Properties) { var key1 = attribute.Key.Content.ToLowerInvariant(); var key2 = CreateClrProperty(key1).ToLowerInvariant(); if (cache[item.Kind].ContainsKey(key1)) { if (attribute.Value.Type == null) { var value = cache[item.Kind][key1].GetValue(item); if (value == null || value.Equals(attribute.Value.Content) == false) { canAdd = false; continue; } } if (attribute.Value.Type == typeof(TimeSpan)) { var value = cache[item.Kind][key1].GetValue(item); if ((value is DateTime) == false) { canAdd = false; } var dbDate = ((DateTime)value).Date; var qdDate = (DateTime.Now - (TimeSpan)attribute.Value.Hint).Date; if (dbDate != qdDate) { canAdd = false; continue; } } } else if (cache[item.Kind].ContainsKey(key2)) { var value = cache[item.Kind][key2].GetValue(item); if (value == null || value.Equals(attribute.Value.Content) == false) { canAdd = false; } } } if (canAdd) { result.Add(item); } } return(result); }