我需要在运行时知道属性名称和类型来进行查询。我已经使用了反射IEnumerable<>但是会因此出现性能问题吗?
我想知道是否有更好的方法来做到这一点IQueryable<>?我已经研究了一下,Expressions但我不太确定该怎么做。
编辑:
目前这似乎不是性能问题,但我还没有测试过非常大的工作负载。
我需要搜索运行时已知的多个不同类型的字段。
var cosmosClient = new DocumentClient(new Uri(cosmosDBEndpointUrl), cosmosDBAuthorizationKey);
var feedOptions = new FeedOptions { MaxItemCount = -1, EnableCrossPartitionQuery = true };
var objects = cosmosClient.CreateDocumentQuery<MyObject>(collectionLink, feedOptions).AsEnumerable();
if (!string.IsNullOrEmpty(searchQuery))
{
var predicate = PredicateBuilder.New<MyObject>();
foreach (var fieldToSearch in fieldsToSearch)
{
predicate = predicate.Or(x => x.GetPropertyValue(fieldToSearch).CheckDateTime().ToString()
.Contains(searchQuery, StringComparison.InvariantCultureIgnoreCase));
objects = objects.Where(predicate);
}
}
objects = objects.Skip(index)
.Take(pageSize);
return objects.ToList();
这个辅助方法:
public static object GetPropertyValue(this object obj, string propertyName)
{
foreach (var part in propertyName.Split('.'))
{
if (obj == null) { return null; }
Type type = obj.GetType();
PropertyInfo info = type.GetProperty(part, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
if (info == null) { return null; }
obj = info.GetValue(obj, null);
}
return obj;
}
我不知道在这种特殊情况下是否有更好的方法来做到这一点。
小怪兽爱吃肉
相关分类