类型字典<字符串,字符串>不支持 C# 比较运算符

本文关键字:字符串 比较 运算符 不支持 字典 类型 | 更新日期: 2023-09-27 18:04:48

我得到一个字典,我想获取字典中键字段的匹配数据库条目。因此,下面的代码获取了等于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));

有什么想法吗?

类型字典<字符串,字符串>不支持 C# 比较运算符

请注意

,在您尝试迭代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.方法数据键(。

从本质上讲,由于延迟执行,您会在意外行上获得异常。

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

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

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

相关资源:

  • LINQ 和延迟执行

你确定不是这一行失败了吗:

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 中工作。