首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在运行时使用属性名称和类型查询IQueryable

在运行时使用属性名称和类型查询IQueryable
EN

Stack Overflow用户
提问于 2019-06-29 00:18:48
回答 1查看 280关注 0票数 0

我需要在运行时知道属性名称和类型的情况下进行查询。我在IEnumerable<>上使用了反射,但是会因为这个而出现性能问题吗?

我想知道是否有更好的方法使用IQueryable<>来实现这一点?我研究了一下Expressions,但我不太确定该怎么做。

编辑:

目前这似乎不是一个性能问题,但我还没有在非常大的工作负载下进行测试。

我需要在运行时已知的多个不同类型的字段中进行搜索。

代码语言:javascript
复制
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();

和这个辅助方法:

代码语言:javascript
复制
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;
}

我不知道在这种特殊情况下,是否有更好的方法来做到这一点。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56810209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档