2009-06-26 1 views
2

LINQクエリのXmlNodeでプロパティ "InnerText"を呼び出すと、 "同じキーのアイテムが既に追加されています"という奇妙なエラーが発生します。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
  • XmlDocumentWrapperが方法は、与えられたXML文字列のためのXmlDocumentを返しDB内の文字列のXMLがある

"InnerText"がなくても照会が完璧に機能します(partnerIdにはXmlNodeが含まれています)。これはLINQの何らかのバグですか、それとも何ですか?この問題の回避策は何ですか?

スタックトレース:

System.ArgumentExceptionの:同じキーを持つ項目が既に追加されています。 System.ThrowHelper.ThrowArgumentExceptionで (ExceptionResourceリソース) System.Collections.Generic.Dictionary 2.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.DataQuery 1.System.Collections.Generic.IEnumerable.GetEnumerator()

+0

任意のstacktrace?グループ分けをしていますか?別の?辞書がどこかに含まれているように聞こえます... –

+0

グルーピングはありません。私が得る唯一のメッセージは、 "同じキーを持つアイテムがすでに追加されています"です。 –

答えて

2

でSQLに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 
    }); 
+0

ジョン、素晴らしい解決策。ロンドンのStackOverflow Dev Daysでビールを買うよ。 :) キーは ".AsEnumerable()"で、ラムダ式でこれを照会する必要はありません。これは、dataContext.SomeTableInDb.AsEnumerable()のpartnerTableのように行うこともできます。 –

+0

"Where"句をSQLで実行したくないのですか? SQLでどのくらいのクエリーを実行したいのか、CLRでどれくらい実行したいのかを調べる必要があります。 –

+0

はい、私は欲しいですが、私はちょうど非ラムダクエリをしたい場合は、この問題を解決する方法の例を入れました。 しかし、ほとんどの場合、SQLのwhere節を実行すると、パフォーマンスが向上します。ラムダソリューションは完璧です。 –

関連する問題