当我在LINQ查询中在XmlNode上调用一个属性“XmlNode”时,我得到了一个奇怪的错误:“已经添加了一个具有相同键的项”。
查询如下:
var partnersXml = from partnerTable in dataContext.SomeTableInDb
where partnerTable.XmlType == "partner"
select new
{
partnerId = XmlDocumentWrapper(partnerTable.XmlDocument).SelectSingleNode("//*[name()='partnerId']").InnerText
};解释:
返回XmlDocument。
查询完全没有"InnerText“(然后partnerId包含XmlNode)。这是LINQ中的某种bug吗?这个问题的解决办法是什么?
堆栈跟踪:
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()
发布于 2009-06-26 09:06:37
看起来LINQ正在尝试进行一些映射,而您希望它在.NET端完成。(我想--如果你想让数据库做XPath,恐怕我不知道。)试试这个:
var partnersXml = dataContext.SomeTableInDb
.Where(x => x.XmlType == "partner")
.AsEnumerable() // This forces the rest of the query to be done in the CLR
.Select(x => new {
partnerId = XmlDocumentWrapper(x.XmlDocument)
.SelectSingleNode("//*[name()='partnerId']")
.InnerText
});https://stackoverflow.com/questions/1048041
复制相似问题