Łączenie wielu tabel przy użyciu LINQ

0

Witam,

próbuję poradzić sobie z następującym problemem i proszę Was o pomoc.

Mam dane:

List<DataTable> listOfTables = new List<DataTable>()

Każdy element powyższej listy to tabela z dokładnie dwoma kolumnami: Identyfikatorem oraz wartością przypisaną do tego identyfikatora.

Jeśli lista zawiera znaną liczbę elementów (np. 2) to sprawa jest prosta:

var results = from table1 in listOfTables[0].AsEnumerable()
              join table2 in listOfTables[1].AsEnumerable() on (string)table1[INDEX_COLUMN_NAME] equals (string)table2[INDEX_COLUMN_NAME]
              select new
              {
                  ID = (string)table1[INDEX_COLUMN_NAME],
                  Col1 = (string)table1[listOfTables[0].Columns[1].ColumnName],
                  Col2 = (string)table2[listOfTables[1].Columns[1].ColumnName]
              };

W wyniku powyższego otrzymuję results jako zbiór wierszy o strukturze: ID | Col1 | Col2.

Mogę je wypisać na przykład w ten sposób:

foreach (var item in results)
        {
            Console.WriteLine(String.Format("ID = {0}, ColX = {1}, ColY = {2}", item.ID, item.Col1, item.Col2));
        }

I teraz mój problem, z którym się mierzę:

Chciałbym zrobić uniwersalny kod, który wypisze mi na ekran tyle kolumn, ile elementów ma lista zadeklarowana na początku posta.
Wiadome jest, że każdy element listy to tabela z dokładnie dwoma kolumnami, z których jedna jest zawsze identyfikatorem, po którym następuje łączenie.

Proszę o pomoc.

0

W takim przypadku chyba trzeba zbudować takie wyrażenie ręcznie, namiętnie korzystając z tej klasy: https://msdn.microsoft.com/en-us/library/system.linq.expressions.expression%28v=vs.110%29.aspx

0

somekind, dzięki za podpowiedź. Przejrzałem msdn i inne strony i dalej nie wiem, jak tego użyć w moim przypadku.
Ktoś pomoże?

0

Nie wiem czy dobrze zrozumiałem ale można by pójść na łatwiznę i zrobić coś takiego:

class Program
{
   static void Main(string[] args)
   {
      var anonymousCollection = new[]
      {
         new {Id = 1, Col1 = "Foo11", Col2 = "Foo12"},
         new {Id = 2, Col1 = "Foo21", Col2 = "Foo22"}
      };

      var anonymousElement = new {Id = 3, Col1 = "Foo31", Col2 = "Foo32"};
      anonymousElement.ToConsole();

      foreach (var anonymousType in anonymousCollection)
      {
         anonymousType.ToConsole();
      }
   }
}

public static class Ext
{
   public static void ToConsole(this object obj)
   {
      var properties = obj.GetType()
                           .GetProperties();
      foreach (var propertyInfo in properties)
      {
         Console.Write("{0}={1} ", propertyInfo.Name, propertyInfo.GetValue(obj));
      }
      Console.WriteLine();
   }
}

Output:
''Id=3 Col1=Foo31 Col2=Foo32
Id=1 Col1=Foo11 Col2=Foo12
Id=2 Col1=Foo21 Col2=Foo22''

0

@Szach, to co Ci podlinkowałem pozwala zbudować dowolny kod C# w locie i go wykonać. Nie ukrywam, że jest to dość trudne. Ale Ty niekoniecznie tego potrzebujesz...

Musisz używać LINQ? Bo jeśli nie, to po prostu utwórz sobie wynikowe DataTable o liczbie kolumn (albo jakiś własny specjalizowany obiekt), a potem przejdź w pętli po listOfTables i wypełnij. Jedyne co, to to, że sam będziesz musiał pilnować zgodności ID, ale to raptem jeden dodatkowy if.

1 użytkowników online, w tym zalogowanych: 0, gości: 1