繁体   English   中英

类型为Dictionary的C#比较运算符不支持<string,string>

[英]C# Comparison operators not supported for type Dictionary<string,string>

我得到一本字典,我想获得字典中关键字段的匹配数据库条目。 因此,下面的代码获取的所有数据库字段都等于dictionary.keys中的数据。 到现在为止还挺好。 现在,当我循环它并且我尝试从与键x匹配的字段中获取字段时,它失败并出现异常:

{“类型'System.Collections.Generic.Dictionary`2 + KeyCollection [System.String,System.String]'}不支持比较运算符

var fields = _dc.fieldInfos.Where(x => x.name.Equals(param.MethodData.Keys));
foreach (var entry in param.MethodData)
{
    KeyValuePair<string, string> entry1 = entry;
    var field = fields.SingleOrDefault(x => x.name.Equals(entry1.Key));
    if (field == null)
    ....
}

失败的是这样的:

var field = fields.SingleOrDefault(x => x.name.Equals(entry1.Key));

有任何想法吗?

这是因为LINQ to SQL提供程序无法将传递给SingleOrDefault方法的C#表达式转换为SQL语句。

通过让LINQ to SQL执行fields查询, 然后使用SingleOrDefault方法进一步过滤它,可以轻松解决此问题。 这样,第二个操作将发生在内存中的对象集合而不是数据库上:

var field = fields.ToList().SingleOrDefault(x => x.name.Equals(entry1.Key));

相关资源:

请注意,在尝试迭代fields (第5行)之前, _dc.fieldInfos.Where(x => x.name.Equals(param.MethodData.Keys)) (第1行) 实际上并未执行

此时, x.name.Equals(param.MethodData.Keys)失败,因为无法将string (x.name)与KeyCollection<string> (param.MethodData.Keys)进行比较。

基本上,由于延迟执行,您在意外行上获得异常。

你确定这条线不是失败的吗?

var fields = _dc.fieldInfos.Where(x => x.name.Equals(param.MethodData.Keys)); 

因为name不会匹配字符串集合。

如果是这样,我会改写为:

var fields = _dc.fieldInfos.Where(x => param.MethodData.Keys.Contains(x.name));

entry1.key是一个字符串,所以我看不出为什么你突出显示的行会因该消息而失败。

var fields = _dc.fieldInfos.Where(x => x.name.Equals(param.MethodData.Keys));

这通过将其名称与键集合进行匹配来检索(实际上是使用延迟执行的过滤器) fieldInfos 我不知道fieldInfo.Nameparam.MethodData.Keys是什么意思,但我认为它不是你想要的。

我建议采取以下措施:

var pairs = param.MethodData.Join(_dc.fieldInfos, 
    kvp => kvp.Key, 
    fi => fi.name, 
    (kvp, fi) => new { Key = kvp.Key, FieldInfo = fi });

foreach (var pair in pairs)
    param.MethodData[pair.Key] = pair.FieldInfo;

我不确定它会在Linq to SQL中工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM