2017-02-22 4 views
-1

次のリンクに基づいてCombine tables using row values as column LINQ C# SQL私は行の値を列として使用する2つのIEnumerablesを結合します。書かれているものとは違って、私はWebサービスによって得られる一定のフィールドを持つテーブルを使用していません。LINQと列テーブルの定数を結合しないでください

var element = XDocument.Parse(getstring1); 

      var dataCode = from item in element.Descendants("Field") 
          where item.Element("Code").Value == "CODE" 
          select item.Element("Value"); 

      var dataDescription = from item in element.Descendants("Field") 
            where item.Element("Code").Value == "DESCRIPTION" 
            select item.Element("Value"); 

      var resultsSet = dataCode.Zip(dataDescription, Tuple.Create); 

      element = XDocument.Parse(getstring2); 

      var dataSizeSet = from item in element.Descendants("Field") 
           where item.Element("Code").Value == "SIZESET" 
           select item.Element("Value"); 

      var dataSizeId = from item in element.Descendants("Field") 
          where item.Element("Code").Value == "SIZEID" 
          select item.Element("Value"); 

      var dataSizeLabel = from item in element.Descendants("Field") 
           where item.Element("Code").Value == "SIZELABEL" 
           select item.Element("Value"); 

      var resultsLabel = dataSizeSet.ZipThree(dataSizeId, dataSizeLabel, Tuple.Create); 

      var results = resultsSet.GroupJoin(resultsLabel, 
          set => set.Item1, 
          label => label.Item1, 
          (set, label) => new 
          { 
           set.Item1, 
           set.Item2, 
           Label01 = label.SingleOrDefault(x => x.Item2.Value == "1").Item3, 
           Label02 = label.SingleOrDefault(x => x.Item2.Value == "2").Item3, 
           Label03 = label.SingleOrDefault(x => x.Item2.Value == "3").Item3, 
           Label04 = label.SingleOrDefault(x => x.Item2.Value == "4").Item3, 
           Label05 = label.SingleOrDefault(x => x.Item2.Value == "5").Item3, 
           Label06 = label.SingleOrDefault(x => x.Item2.Value == "6").Item3, 
           Label07 = label.SingleOrDefault(x => x.Item2.Value == "7").Item3, 
           Label08 = label.SingleOrDefault(x => x.Item2.Value == "8").Item3, 
           Label09 = label.SingleOrDefault(x => x.Item2.Value == "9").Item3, 
           Label10 = label.SingleOrDefault(x => x.Item2.Value == "10").Item3, 
           Label11 = label.SingleOrDefault(x => x.Item2.Value == "11").Item3, 
           Label12 = label.SingleOrDefault(x => x.Item2.Value == "12").Item3, 
           Label13 = label.SingleOrDefault(x => x.Item2.Value == "13").Item3, 
           Label14 = label.SingleOrDefault(x => x.Item2.Value == "14").Item3, 
           Label15 = label.SingleOrDefault(x => x.Item2.Value == "15").Item3, 
           Label16 = label.SingleOrDefault(x => x.Item2.Value == "16").Item3, 
           Label17 = label.SingleOrDefault(x => x.Item2.Value == "17").Item3, 
           Label18 = label.SingleOrDefault(x => x.Item2.Value == "18").Item3, 
           Label19 = label.SingleOrDefault(x => x.Item2.Value == "19").Item3, 
           Label20 = label.SingleOrDefault(x => x.Item2.Value == "20").Item3 
          }); 

VAR「の結果は」、私はIEnumerableをを展開する場合は、何も含まれていない、次のエラーメッセージを取得:「オブジェクトのインスタンスに設定されていないオブジェクト参照を」。

私に示唆することはありますか?

+3

私はあなたの質問がすぐに重複として閉じられると信じています。しかし、将来的には、すべてのコードをダンプするだけではありません。いくつかの説明を追加する*あなたのコードが何をして、問題を再現するためにいくつかのXMLを提供する –

+0

私の意見では、それは重複ではありませんが、統合です –

+1

あなたは*インテグレーションとして何を呼びますか? ://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it?rq = 1 –

答えて

0

nullを返した可能性があるlabel.SingleOrDefault()を使用しています。この場合、オブジェクト参照がオブジェクトのインスタンスに設定されていないと失敗する結果の.ItemNを呼び出します。

+0

だから、どうすればいいですか?ご回答有難うございます! –

+0

本当にあなたがしようとしていることの詳細に依存します。例えば。 Label01がnullで、C#6を使用している場合は、 "Label01 = label.SingleOrDefault(x => x.Item2.Value ==" 1 ")?Item3"と書くと、xの場合はLabel01をnullに設定します。 Item2.Value!= "1"。 – Jon

0

ピボットテーブルが必要です。以下のコードは、第1テーブルを第2テーブルの情報で更新します。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      DataTable personTbl = new DataTable(); 
      personTbl.Columns.Add("Id", typeof(int)); 
      personTbl.Columns.Add("Name", typeof(string)); 
      personTbl.Columns.Add("Age", typeof(int)); 

      personTbl.Rows.Add(new object[] { 1, "Steve", 21}); 
      personTbl.Rows.Add(new object[] { 2, "Jack", 17}); 
      personTbl.Rows.Add(new object[] { 3, "Alcice", 25}); 
      personTbl.Rows.Add(new object[] { 4, "Harry", 14}); 

      DataTable personInfo = new DataTable(); 
      personInfo.Columns.Add("UId", typeof(int)); 
      personInfo.Columns.Add("Key", typeof(string)); 
      personInfo.Columns.Add("Value", typeof(string)); 

      personInfo.Rows.Add(new object[] { 1, "Height", "70"}); 
      personInfo.Rows.Add(new object[] { 2, "Height", "65"}); 
      personInfo.Rows.Add(new object[] { 2, "Eyes", "Blue"}); 
      personInfo.Rows.Add(new object[] { 4, "Height", "51"}); 
      personInfo.Rows.Add(new object[] { 3, "Hair", "Brown"}); 
      personInfo.Rows.Add(new object[] { 1, "Eyes", "Green"}); 

      List<string> infoType = personInfo.AsEnumerable().Select(x => x.Field<string>("Key")).Distinct().ToList(); 

      foreach (string type in infoType) 
      { 
       personTbl.Columns.Add(type, typeof(string)); 
      } 

      Dictionary<int, List<DataRow>> dict = personInfo.AsEnumerable().GroupBy(x => x.Field<int>("UId"), y => y) 
       .ToDictionary(x => x.Key, y => y.ToList()); 

      foreach (DataRow row in personTbl.AsEnumerable()) 
      { 
       int id = row.Field<int>("Id"); 
       if(dict.ContainsKey(id)) 
       { 
        List<DataRow> rowInfo = dict[id]; 
        foreach (DataRow col in rowInfo) 
        { 
         row[(string)col["key"]] = col["Value"]; 
        } 
       } 
      } 
     } 
    } 
} 
関連する問題