2017-02-22 6 views
-1

На основе следующей ссылки Combine tables using row values as column LINQ C# SQL Я бы объединил два IEnumerables, используя значения строк в качестве столбца. В отличие от написанного, я не использую таблицы с постоянными полями, полученными веб-службой.Объединить значения констант в таблицах с константой 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 
          }); 

УАК «результаты», если я расширить IEnumerable, не содержит в себе ничего, и получить следующее сообщение об ошибке: «ссылка на объект не указывает на экземпляр объекта».

Есть идеи предложить мне?

+3

Я считаю, что ваш вопрос будет закрыт в ближайшее время как дубликат. Но для будущего - не просто сбрасывайте весь свой код. Добавьте некоторое описание *, что * ваш код делает и предоставляет некоторый xml для воспроизведения вашей проблемы. –

+0

По-моему, это не дубликат, но это интеграция. –

+1

Я не знаю, что вы называете * интеграцией *, но это дубликат http : //stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it? rq = 1 –

ответ

0

Вы используете label.SingleOrDefault(), который может возвращать null, а затем вызывает .ItemN в результате, который в этом случае завершится неудачей, если ссылка объекта не будет установлена ​​в экземпляр объекта.

+0

Итак, какой метод мне нужно использовать? Спасибо за Ваш ответ! –

+0

Это действительно зависит от деталей того, что вы пытаетесь сделать. Например. если Label01 имеет значение NULL, и вы используете C# 6, вы можете написать «Label01 = label.SingleOrDefault (x => x.Item2.Value ==" 1 ") ?. Item3", который установил бы Label01 равным null, если x. 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"]; 
        } 
       } 
      } 
     } 
    } 
} 
Смежные вопросы