在我之前关于使用动态构建的字符串(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)方法。这是可行的,但我对寻找其他解决方案很感兴趣。尤其是为了进行基准测试。
有什么想法吗?
发布于 2009-08-20 08:50:53
首先,如果你以这种方式访问字典,那么你就没有把它当做字典来使用--你有没有尝试过:
var qry = myDictionary.Values.AsQueryable().Where(sQuery);(请注意,如果您使用的是object,则可能需要在其中的某个位置包含Cast<Customer>或OfType<Customer> )
否则:
在IEnumerable<T>中(因此在调用AsQueryable()扩展方法之后对于IQueryable<T>也是如此)中的Dictionary<TKey,TValue>的T是KeyValuePair<TKey,TValue> -因此您应该能够使用Where("Value.CustomerID == 12345")或类似的东西。
https://stackoverflow.com/questions/1304830
复制相似问题