gpt4 book ai didi

c# - 将 LINQ 动态查询库与 Dictionary 和 .AsQueryable() 结合使用

转载 作者:太空狗 更新时间:2023-10-29 21:56:03 25 4
gpt4 key购买 nike

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

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

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

所以认为我很聪明,我创建了一个类扩展 : Dictionary<string, object> , ICustomTypeDescriptor`。

这让我可以覆盖 GetProperties()在类型上。这很棒。我现在可以迭代字典键并将它们添加到 PropertyDescriptorCollection返回。

但是后来我遇到了另一个问题。在整个 Dynamic LINQ 库中,它们使用仅包含类型的“表达式实例”。但是对于我的 CustomTypeDescriptor工作解决方案我需要类型的实际实例,然后才能应用 TypeDescriptor.GetProperties(instance, false) .

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

我目前的解决方案是将数据转换为 DataTable并使用 .Select(query)方法。哪个有效,但我有兴趣寻找其他解决方案。特别是用于基准测试目的。

有什么想法吗?

最佳答案

首先 - 如果您以这种方式访问​​字典,那么您就没有将它用作字典 - 您是否尝试过:

var qry = myDictionary.Values.AsQueryable().Where(sQuery);

(请注意,如果您使用的是 object,您可能需要在某处使用 Cast<Customer>OfType<Customer>)

否则:

TIEnumerable<T> (因此也适用于 IQueryable<T> 在调用 AsQueryable() 扩展方法之后)对于 Dictionary<TKey,TValue>KeyValuePair<TKey,TValue> - 所以你应该可以使用 Where("Value.CustomerID == 12345")或类似的东西。

关于c# - 将 LINQ 动态查询库与 Dictionary<string, object> 和 .AsQueryable() 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1304830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com