我需要在运行时知道属性名称和类型的情况下进行查询。我在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;
}
我不知道在这种特殊情况下,是否有更好的方法来做到这一点。
https://stackoverflow.com/questions/56810209
复制相似问题