Udostępnij za pośrednictwem


Przekształcanie danych za pomocą LINQ (C#)

Zapytanie o języku zintegrowanym (LINQ)to nie tylko pobierania danych.Również jest potężnym narzędziem do przekształcania danych.Za pomocą LINQ kwerendę, można użyć sekwencji źródłowej, jak dane wejściowe i modyfikowania go na wiele sposobów, aby utworzyć nową sekwencję danych wyjściowych.Można modyfikować sekwencji nie modyfikując samych elementów przez sortowanie i grupowanie. Ale być może najbardziej rozbudowanych funkcji LINQ kwerend jest możliwość tworzenia nowych typów.Jest to możliwe w Wybierz klauzuli.Na przykład można wykonywać następujące zadania:

  • Scalanie wielu sekwencji wejściowych w sekwencji danych wyjściowych w jeden, który ma nowy typ.

  • Przy tworzeniu sekwencji danych wyjściowych, której elementy składają się z tylko jednego lub kilku właściwości każdego elementu w sekwencji źródłowej.

  • Przy tworzeniu sekwencji danych wyjściowych, której elementy składają się z wyników operacji wykonywanych na danych źródłowych.

  • Przy tworzeniu sekwencji danych wyjściowych w innym formacie.Na przykład można przekształcać dane z wierszy SQL lub plików tekstowych w formacie XML.

Są to tylko kilka przykładów.Oczywiście przekształcenia te mogą być łączone w różny sposób w tej samej kwerendy.Ponadto kolejności jednej kwerendy może służyć jako sekwencji wejściowych dla nowej kwerendy.

Łączenie wielu obrazów wejściowych w sekwencji wyjście

Można użyć LINQ kwerendy do utworzenia sekwencji danych wyjściowych, który zawiera elementy z więcej niż jednej sekwencji wejściowych.Poniższy przykład pokazuje, jak połączyć dwa struktur danych w pamięci, ale te same zasady mogą być stosowane do łączenia danych ze źródeł XML lub SQL lub zestawu danych.Przyjmijmy następujące typy dwie klasy:

class Student
{
    public string First { get; set; }
    public string Last {get; set;}
    public int ID { get; set; }
    public string Street { get; set; }
    public string City { get; set; }
    public List<int> Scores;
}

class Teacher
{
    public string First { get; set; }
    public string Last { get; set; }
    public int ID { get; set; } 
    public string City { get; set; }
}

Kwerendę można znaleźć w poniższym przykładzie:

class DataTransformations
{
    static void Main()
    {
        // Create the first data source.
        List<Student> students = new List<Student>()
        {
            new Student {First="Svetlana",
                Last="Omelchenko", 
                ID=111, 
                Street="123 Main Street",
                City="Seattle",
                Scores= new List<int> {97, 92, 81, 60}},
            new Student {First="Claire",
                Last="O’Donnell", 
                ID=112,
                Street="124 Main Street",
                City="Redmond",
                Scores= new List<int> {75, 84, 91, 39}},
            new Student {First="Sven",
                Last="Mortensen",
                ID=113,
                Street="125 Main Street",
                City="Lake City",
                Scores= new List<int> {88, 94, 65, 91}},
        };

        // Create the second data source.
        List<Teacher> teachers = new List<Teacher>()
        {                
            new Teacher {First="Ann", Last="Beebe", ID=945, City = "Seattle"},
            new Teacher {First="Alex", Last="Robinson", ID=956, City = "Redmond"},
            new Teacher {First="Michiyo", Last="Sato", ID=972, City = "Tacoma"}
        };

        // Create the query. 
        var peopleInSeattle = (from student in students
                    where student.City == "Seattle" 
                    select student.Last)
                    .Concat(from teacher in teachers
                            where teacher.City == "Seattle" 
                            select teacher.Last);

        Console.WriteLine("The following students and teachers live in Seattle:");
        // Execute the query. 
        foreach (var person in peopleInSeattle)
        {
            Console.WriteLine(person);
        }

        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
    The following students and teachers live in Seattle:
    Omelchenko
    Beebe
 */

Aby uzyskać więcej informacji, zobacz Klauzula join (odwołanie w C#) i select — Klauzula (odwołanie w C#).

Wybranie podzestawu elementu każdego źródła

Istnieją dwa podstawowe sposoby, aby wybrać podzbiór każdego elementu w sekwencji źródłowej:

  1. Aby zaznaczyć tylko jeden element członkowski element źródłowy, należy użyć operacji dot.W poniższym przykładzie założono, że Customer obiekt zawiera kilka właściwości publiczne, w tym ciągu o nazwie City.Podczas wykonywania tej kwerendy powoduje wygenerowanie sekwencji wyjścia ciągów.

    var query = from cust in Customers
                select cust.City;
    
  2. Aby utworzyć elementy, które zawierają więcej niż jedną właściwość z elementu źródłowego, można użyć Inicjator obiektu z nazwanego obiektu lub typ anonimowy.W poniższym przykładzie pokazano użycie typ anonimowy hermetyzacji dwie właściwości z każdej Customer element:

    var query = from cust in Customer
                select new {Name = cust.Name, City = cust.City};
    

Aby uzyskać więcej informacji, zobacz Inicjatory obiektów i kolekcji (Przewodnik programowania w języku C#) i Typy anonimowe (Przewodnik programowania w języku C#).

Przekształcanie obiektów w pamięci w formacie XML

LINQkwerendy ułatwiają przekształcenie danych między struktur danych w pamięci, baz danych SQL, ADO.NET zestawów danych i XML strumieni lub dokumenty.Poniższy przykład powoduje modyfikację obiektów w strukturę danych w pamięci do elementów XML.

class XMLTransform
{
    static void Main()
    {            
        // Create the data source by using a collection initializer. 
        // The Student class was defined previously in this topic.
        List<Student> students = new List<Student>()
        {
            new Student {First="Svetlana", Last="Omelchenko", ID=111, Scores = new List<int>{97, 92, 81, 60}},
            new Student {First="Claire", Last="O’Donnell", ID=112, Scores = new List<int>{75, 84, 91, 39}},
            new Student {First="Sven", Last="Mortensen", ID=113, Scores = new List<int>{88, 94, 65, 91}},
        };

        // Create the query. 
        var studentsToXML = new XElement("Root",
            from student in students
            let x = String.Format("{0},{1},{2},{3}", student.Scores[0],
                    student.Scores[1], student.Scores[2], student.Scores[3])
            select new XElement("student",
                       new XElement("First", student.First),
                       new XElement("Last", student.Last),
                       new XElement("Scores", x)
                    ) // end "student"
                ); // end "Root" 

        // Execute the query.
        Console.WriteLine(studentsToXML);

        // Keep the console open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}

Kod generuje następujące dane wyjściowe XML:

< Root>
  <student>
    <First>Svetlana</First>
    <Last>Omelchenko</Last>
    <Scores>97,92,81,60</Scores>
  </student>
  <student>
    <First>Claire</First>
    <Last>O'Donnell</Last>
    <Scores>75,84,91,39</Scores>
  </student>
  <student>
    <First>Sven</First>
    <Last>Mortensen</Last>
    <Scores>88,94,65,91</Scores>
  </student>
</Root>

Aby uzyskać więcej informacji, zobacz Creating XML Trees in C# (LINQ to XML).

Wykonywanie operacji na elementy źródła

Sekwencję danych wyjściowych mogą nie zawierać żadnych elementów lub właściwości elementu z sekwencji źródła.Dane wyjściowe mogą być sekwencja wartości, która jest obliczana przy użyciu elementów źródła jako argumentów wejściowych.Następująca kwerenda proste, gdy jest wykonywana, wyświetla sekwencji ciągów, którego wartości reprezentują obliczenia oparte na sekwencji źródłowej elementami typu double.

[!UWAGA]

Wywołanie metody w wyrażeniach kwerend nie jest obsługiwany, jeśli kwerenda zostanie zamieniona na niektórych innych domen.Na przykład, nie można wywołać zwykła metodą C# LINQ do SQL , ponieważ program SQL Server jest brak kontekstu dla niego.Można jednak mapować procedur przechowywanych do metod i dzwonią do tych.Aby uzyskać więcej informacji, zobacz Stored Procedures [LINQ to SQL].

class FormatQuery
{
    static void Main()
    {            
        // Data source. 
        double[] radii = { 1, 2, 3 };

        // Query.
        IEnumerable<string> query =
            from rad in radii
            select String.Format("Area = {0}", (rad * rad) * 3.14);

        // Query execution.  
        foreach (string s in query)
            Console.WriteLine(s);

        // Keep the console open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
    Area = 3.14
    Area = 12.56
    Area = 28.26
*/

Zobacz też

Zadania

Porady: łączenie danych w LINQ za pomocą sprzężeń (Visual Basic)

Informacje

select — Klauzula (odwołanie w C#)

Koncepcje

Wyrażenia kwerend LINQ (Przewodnik programowania w języku C#)

Inne zasoby

LINQ (zapytania o języku zintegrowanym)

LINQ to SQL [LINQ to SQL]

LINQ to DataSet

LINQ to XML