【发布时间】:2009-06-26 08:42:39
【问题描述】:
当我在 LINQ 查询中调用 XmlNode 上的属性“InnerText”时,我收到一个奇怪的错误:“已添加具有相同键的项目。”。
查询如下:
var partnersXml = from partnerTable in dataContext.SomeTableInDb
where partnerTable.XmlType == "partner"
select new
{
partnerId = XmlDocumentWrapper(partnerTable.XmlDocument).SelectSingleNode("//*[name()='partnerId']").InnerText
};
解释:
- partnerTable.XmlDocument 是 DB 中的字符串 xml
- XmlDocumentWrapper 方法为给定的 xml 字符串返回一个 XmlDocument
在没有“InnerText”的情况下查询可以完美运行(然后 partnerId 包含 XmlNode)。这是 LINQ 中的某种错误还是什么?这个问题的解决方法是什么?
堆栈跟踪:
System.ArgumentException:已添加具有相同键的项目。
在 System.ThrowHelper.ThrowArgumentException(ExceptionResource 资源)
在 System.Collections.Generic.Dictionary2.Insert(TKey key, TValue value, Boolean add)
at System.Data.Linq.Mapping.UnmappedType.GetDataMember(MemberInfo mi)
at System.Data.Linq.SqlClient.SqlFactory.Member(SqlExpression expr, MemberInfo member)
at System.Data.Linq.SqlClient.QueryConverter.VisitMemberAccess(MemberExpression ma)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
at System.Data.Linq.SqlClient.QueryConverter.Visit(Expression node)
at System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp)
at System.Data.Linq.SqlClient.QueryConverter.VisitNew(NewExpression qn)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
at System.Data.Linq.SqlClient.QueryConverter.Visit(Expression node)
at System.Data.Linq.SqlClient.QueryConverter.VisitSelect(Expression sequence, LambdaExpression selector)
at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)
at System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
at System.Data.Linq.SqlClient.QueryConverter.ConvertOuter(Expression node)
at System.Data.Linq.SqlClient.SqlProvider.BuildQuery(Expression query, SqlNodeAnnotations annotations)
at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
at System.Data.Linq.DataQuery1.System.Collections.Generic.IEnumerable.GetEnumerator()
【问题讨论】:
-
任何堆栈跟踪?你在做任何分组吗?清楚的?听起来好像在某处涉及字典......
-
没有分组,没有区别。我得到的唯一消息是“已添加具有相同密钥的项目。”