首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Dictionary<string、object>和.AsQueryable()中使用LINQ动态查询库

在Dictionary<string、object>和.AsQueryable()中使用LINQ动态查询库
EN

Stack Overflow用户
提问于 2009-08-20 08:39:44
回答 1查看 6.6K关注 0票数 6

在我之前关于使用动态构建的字符串(where子句)并在LINQ中使用它们的一个问题中,我被引导到LINQ动态查询库Dynamic LINQ

第一个问题是它只适用于IQueryable,但是可以通过在任何IEnumerable上使用.AsQueryable()扩展方法来克服这个问题。

我遇到的问题是,Dynamic LINQ正在我的字典中寻找一个名为"CustomerID“的属性(或者传递给dynamic linq的字符串谓词的任何东西)。这显然是行不通的,因为字典只有键和值。

因此,考虑到我很聪明,我创建了一个扩展: Dictionary<string, object>的类ICustomTypeDescriptor`。

这允许我在类型上重写GetProperties()。这是很棒的。我现在可以迭代字典键并将它们添加到返回的PropertyDescriptorCollection中。

但后来我遇到了另一个问题。在整个动态LINQ库中,它们使用只包含一个类型的“表达式实例”。但是为了让我的CustomTypeDescriptor解决方案工作,在我可以应用TypeDescriptor.GetProperties(instance, false)之前,我需要一个实际的类型实例。

所以让我们来看看真正的问题。考虑到上述所有信息,如果数据存储在具有键值对的字典中,如何将字符串格式的自定义where子句"CustomerID=1234 AND Quantity >= 10000“应用于LINQ查询。

我目前的解决方案是将数据转换为DataTable并使用.Select(query)方法。这是可行的,但我对寻找其他解决方案很感兴趣。尤其是为了进行基准测试。

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2009-08-20 08:50:53

首先,如果你以这种方式访问字典,那么你就没有把它当做字典来使用--你有没有尝试过:

代码语言:javascript
复制
var qry = myDictionary.Values.AsQueryable().Where(sQuery);

(请注意,如果您使用的是object,则可能需要在其中的某个位置包含Cast<Customer>OfType<Customer> )

否则:

IEnumerable<T>中(因此在调用AsQueryable()扩展方法之后对于IQueryable<T>也是如此)中的Dictionary<TKey,TValue>TKeyValuePair<TKey,TValue> -因此您应该能够使用Where("Value.CustomerID == 12345")或类似的东西。

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

https://stackoverflow.com/questions/1304830

复制
相关文章

相似问题

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