Sdílet prostřednictvím


Transformace dat pomocí LINQ (C#)

LINQ (Language-Integrated Query)není pouze o načítání datJe také mocný nástroj transformace dat.Při použití LINQ dotazu, lze použít jako vstup a upravit mnoha způsoby vytvoření nové pořadí výstupu zdrojovou sekvenci.Můžete změnit pořadí, sama nezměnit samotné prvky řazení a seskupování. Ale možná nejvýkonnější funkce LINQ dotazy je schopnost vytvářet nové typy.To lze provést v Vyberte klauzule.Například můžete provádět následující úkoly:

  • Sloučení více vstupní sekvence do sekvence jeden výstup, který má nový typ.

  • Vytvořte výstupní sekvence, jejíž prvky jsou tvořeny pouze jeden nebo několik vlastností jednotlivých prvků ze zdrojové sekvence.

  • Vytvořte výstupní sekvence, jejíž prvky jsou tvořeny výsledky operací prováděných na zdrojových datech.

  • Vytvořte výstupní sekvence v jiném formátu.Například můžete transformovat data z řádků SQL nebo textových souborů do souboru XML.

Jedná se pouze několik příkladů.Samozřejmě tyto transformace lze kombinovat různé způsoby ve stejném dotazu.Kromě toho pořadí výstupu dotazu slouží jako vstupní sekvence pro nový dotaz.

Spojování více vstupů do jednoho výstupu sekvence

Můžete použít LINQ dotazu pro vytvoření posloupnosti výstup, který obsahuje elementy z více než jeden vstupní sekvenční.Následující příklad ukazuje, jak lze kombinací dvou struktury dat v paměti, ale stejné zásady lze sloučit data ze zdroje XML nebo SQL nebo DataSet.Předpokládejme následující typy dvě třídy:

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; }
}

Dotaz v následujícím příkladu:

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
 */

Další informace naleznete v tématu join – klauzule (Referenční dokumentace jazyka C#) a select – klauzule (Referenční dokumentace jazyka C#).

Výběr podmnožiny každý prvek zdroje

Existují dva základní způsoby pro výběr podmnožiny jednotlivých prvků ve zdrojové sekvenci dat:

  1. Chcete-li vybrat pouze jeden člen tohoto prvku zdroje, pomocí operace tečkou.V následujícím příkladu předpokládejme, že Customer objekt obsahuje několik veřejných vlastností, včetně řetězec s názvem City.Při spuštění tohoto dotazu vytvoří sekvenci výstup řetězce.

    var query = from cust in Customers
                select cust.City;
    
  2. Chcete-li vytvořit prvky, které obsahují více než jednu vlastnost z prvku zdroje můžete inicializátor objektu pojmenovaného objektu nebo anonymní typ.Následující příklad ukazuje použití anonymní typ k zapouzdření dvě vlastnosti z každého Customer element:

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

Další informace naleznete v tématu Inicializátory objektu a kolekce (Průvodce programováním v C#) a Anonymní typy (Průvodce programováním v C#).

Transformace objektů v paměti do souboru XML

LINQdotazy usnadňují transformaci dat mezi struktury dat v paměti, databáze SQL, ADO.NET definovaných datových sad a XML datové proudy nebo dokumenty.Následující příklad převede objekty struktury dat v paměti na elementy 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();
    }
}

Kód vytvoří následující výstup kódu 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>

Další informace naleznete v tématu Creating XML Trees in C# (LINQ to XML).

Provádění operací prvků zdroje

Sekvenci výstup nemusí obsahovat všechny prvky nebo vlastnosti prvků ze zdrojové sekvence.Výstup může být též sekvenci hodnot, který je vypočítán pomocí prvky zdroje jako vstupní argumenty.Následující jednoduchý dotaz, když je vykonáváno, vyprodukuje posloupnosti řetězců, jehož hodnoty představují založen na zdrojové sekvence elementy typu double.

[!POZNÁMKA]

Volání metod ve výrazech dotazu není podporována v případě, že dotaz bude přeložen do některé jiné domény.Například nelze volat běžné metody jazyka C# Technologie LINQ to SQL protože SQL Server má žádný kontext pro něj.Můžete však mapovat uložené procedury k metodám a volat ty.Další informace naleznete v tématu 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
*/

Viz také

Úkoly

Postupy: Kombinace dat s LINQ pomocí spojení (Visual Basic)

Referenční dokumentace

select – klauzule (Referenční dokumentace jazyka C#)

Koncepty

LINQ – výrazy dotazů (Průvodce programováním v C#)

Další zdroje

LINQ (Language-Integrated Query)

LINQ to SQL [LINQ to SQL]

LINQ to DataSet

LINQ to XML