【问题标题】:Using LINQ Dynamic Query Library with Dictionary<string, object> and .AsQueryable()将 LINQ 动态查询库与 Dictionary<string, object> 和 .AsQueryable() 一起使用
【发布时间】:2010-11-21 05:57:21
【问题描述】:

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

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

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

所以认为我很聪明,我创建了一个扩展 : Dictionary&lt;string, object&gt; 的类,ICustomTypeDescriptor`。

这让我可以覆盖类型上的GetProperties()。这是伟大的。我现在可以迭代 Dictionary 键并将它们添加到返回的 PropertyDescriptorCollection

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

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

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

有什么想法吗?

【问题讨论】:

    标签: c# linq dictionary properties types


    【解决方案1】:

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

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

    (请注意,如果您使用的是object,您可能会在某处需要Cast&lt;Customer&gt;OfType&lt;Customer&gt;

    否则:

    IEnumerable&lt;T&gt; 中的 T IEnumerable&lt;T&gt; (因此也适用于 IQueryable&lt;T&gt; 在调用 AsQueryable() 扩展方法后)对于 Dictionary&lt;TKey,TValue&gt;KeyValuePair&lt;TKey,TValue&gt; - 所以你应该能够使用 Where("Value.CustomerID == 12345") 或其他东西类似。

    【讨论】:

    • 对此进行有趣的尝试。但是 var qry = myDictionary.Values.AsQueryable().Where(sQuery);只会搜索所有对象的字典值,因此它仍然无法获取存储在“CustomerID”键中的实际名称。根据您的第二个建议,我最接近使用动态 linq 库的方法是使用:搜索字符串,例如:“Keys["CustomerID"] == 12345",但它仍然在库中更深层次地爆炸,因为它们返回的 memberinfo 只是对 KeysCollection 的引用,而不是具体的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 2010-11-24
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    相关资源
    最近更新 更多