我得到一本字典,我想获得字典中关键字段的匹配数据库条目。 因此,下面的代码获取的所有数据库字段都等于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));
有什么想法吗?
答案 0 :(得分:2)
这是因为LINQ to SQL提供程序无法将传递给SingleOrDefault方法的C#表达式转换为SQL语句。
您可以通过让LINQ to SQL执行fields
查询 进一步使用SingleOrDefault方法进行过滤来轻松解决此问题。这样第二个操作将发生在内存中的对象集合而不是数据库:
var field = fields.ToList().SingleOrDefault(x => x.name.Equals(entry1.Key));
相关资源:
答案 1 :(得分:2)
在尝试迭代_dc.fieldInfos.Where(x => x.name.Equals(param.MethodData.Keys))
(第5行)之前,请注意fields
(第1行)实际上并未执行。
此时,x.name.Equals(param.MethodData.Keys)
失败,因为string
(x.name)无法与KeyCollection<string>
(param.MethodData.Keys)进行比较。
基本上,由于延迟执行,您将在意外行上获得异常。
答案 2 :(得分:0)
你确定这条线不是失败的吗?
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
是一个字符串,因此我无法理解为什么您突出显示的行会因该消息而失败。
答案 3 :(得分:0)
var fields = _dc.fieldInfos.Where(x => x.name.Equals(param.MethodData.Keys));
通过将其名称与键集合进行匹配来检索(实际上是使用延迟执行的过滤器)fieldInfos
。我不知道fieldInfo.Name
和param.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中工作。