Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 结合字典使用LINQ动态查询库<;字符串,对象>;和.AsQueryable()_C#_Linq_Dictionary_Properties_Types - Fatal编程技术网

C# 结合字典使用LINQ动态查询库<;字符串,对象>;和.AsQueryable()

C# 结合字典使用LINQ动态查询库<;字符串,对象>;和.AsQueryable(),c#,linq,dictionary,properties,types,C#,Linq,Dictionary,Properties,Types,在我之前关于使用动态构建的字符串(where子句)和在LINQ中使用它们的一个问题中,我被引导到LINQ动态查询库 第一个问题是它只适用于IQueryable,但是可以通过对任何IEnumerable使用.AsQueryable()扩展方法来克服 我遇到的问题是,动态LINQ正在我的字典中查找一个名为“CustomerID”(或传递给动态LINQ的字符串谓词的任何内容)的属性。这显然不起作用,因为字典只有键和值 因此,我认为自己很聪明,于是创建了一个类,扩展了:Dictionary,ICusto

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

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

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

因此,我认为自己很聪明,于是创建了一个类,扩展了
:Dictionary
,ICustomTypeDescriptor`

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

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

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

我当前的解决方案是将数据转换为
数据表
,并使用
.Select(query)
方法。这是可行的,但我有兴趣找到其他解决方案。特别是用于基准测试目的


有什么想法吗?

首先-如果你以这种方式访问词典,那么你就不会将其用作词典-你是否尝试过:

var qry = myDictionary.Values.AsQueryable().Where(sQuery);
(请注意,如果您使用的是
对象
,您可能需要在其中的某个位置使用类型为的
强制转换

否则:


IEnumerable
中的
T
(因此在调用
AsQueryable()
扩展方法之后也适用于
IQueryable
)是
KeyValuePair
,因此您应该能够使用
Where(“Value.CustomerID==12345”)
或类似的东西。

有趣的是这样做的。但是var qry=myDictionary.Values.AsQueryable().Where(sQuery);将只搜索字典中所有对象的值,因此它仍然无法找到存储在键“CustomerID”中的实际名称。根据您的第二个建议,我能得到的最接近使用动态linq库的任何东西是使用:搜索字符串,如:“Keys[“CustomerID”]==12345”,但它仍然在库中炸得更深,因为它们返回的memberinfo只是对KeyCollection的引用,而不是特定值。