Compartilhar via


Transformações de dados com LINQ

LINQ (consulta integrada à linguagem) não é apenas sobre recuperação de dados. Também é uma ferramenta poderosa para transformar dados.Usando um LINQ consulta, você pode usar uma sequência de fonte sistema autônomo entrada e modificá-lo de várias maneiras para criar uma nova sequência de saída. Você pode modificar a sequência sem modificar os próprios elementos, classificação e agrupamento. Mas talvez o recurso mais potente de LINQ consultas é a capacidade de criar novos tipos. Isso é realizado no selecionar cláusula.Por exemplo, você pode executar as seguintes tarefas:

  • Mescle várias seqüências de entrada em uma sequência de saída simples que tem um novo tipo.

  • criar seqüências de saída cujos elementos consistem em apenas uma ou várias propriedades de cada elemento da sequência de fonte.

  • criar cujos elementos consistem nos resultados das operações de seqüências de saída realizadas em dados de fonte.

  • Crie seqüências de saída em um formato diferente.Por exemplo, você pode transformar os dados das linhas do SQL ou arquivos de texto em XML.

Esses são apenas alguns exemplos.Obviamente, essas transformações podem ser combinadas de diversas formas na mesma consulta.Além disso, a sequência de saída de uma consulta pode ser usada sistema autônomo a sequência de entrada para uma nova consulta.

Ingressar em várias entradas em sequência de 1 saída

Você pode usar um LINQ consulta para criar uma sequência de saída que contém elementos de mais de uma sequência de entrada. O exemplo a seguir mostra como agrupar duas estruturas de dados na memória, mas os mesmos princípios podem ser aplicados para agrupar dados de origens XML ou SQL ou conjunto de dados.Considere os seguintes tipos de dois classe:

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

O exemplo a seguir mostra a consulta:

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

Para obter mais informações, consulte (Referência C#) de cláusula de Junção e Selecionar cláusula (Referência C#).

Selecionar um subconjunto de cada elemento de fonte

Há duas maneiras principais para selecionar um subconjunto de cada elemento da sequência de fonte:

  1. Para selecionar apenas um membro do elemento de fonte, use a operação de ponto.O exemplo a seguir, suponha que um Customer objeto contém várias propriedades públicas, incluindo uma seqüência de chamada City. Quando executada, essa consulta produzirá uma sequência de saída de cadeias de caracteres.

    var query = from cust in Customers
                select cust.City;
    
  2. Para criar elementos que contêm mais de uma propriedade do elemento de fonte, você pode usar um inicializador de objeto com um objeto nomeado ou um tipo anônimo.O exemplo a seguir mostra o uso de um tipo anônimo para encapsular duas propriedades de cada Customer elemento:

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

Para obter mais informações, consulte Objeto e inicializadores de coleção (Guia de programação C#) e Tipos anônimos (Guia de programação C#).

Transformar objetos na memória em XML

LINQ consultas facilitam a transformar dados entre estruturas de dados na memória, bancos de dados do SQL ADO.NET Fluxos de datasets e XML ou documentos. O exemplo a seguir transforma objetos em uma estrutura de dados na memória em elementos XML.

class XMLTransform
{
    static void Main()
    {            
        // Create the data source by using a collection initializer.
        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();
    }
}

O código produz a saída XML a seguir:

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

Para obter mais informações, consulte Creating XML Trees in C# (LINQ to XML).

Executar operações em elementos de código-fonte

Uma sequência de saída pode não conter quaisquer elementos ou propriedades do elemento da sequência de fonte.A saída em vez disso, pode ser uma sequência de valores é calculada usando sistema autônomo elementos de fonte sistema autônomo argumentos de entrada.A seguinte consulta simples, quando for executada, gera uma sequência de cadeias de caracteres cujos valores representam um cálculo com base na sequência de fonte dos elementos do tipo double.

Observação:

Não há suporte para a chamada dos métodos em expressões de consulta se a consulta será convertida em algum Outros domínio.Por exemplo, você não é possível telefonar um método translation from VPE for Csharp comum em LINQ to SQL porque o SQL servidor não tem nenhum contexto para ele. No entanto, você pode mapear procedimentos armazenados para métodos e chamar os.Para obter mais informações, consulte 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
*/

Consulte também

Conceitos

Expressões de consulta LINQ (Guia de programação C#)

Referência

Selecionar cláusula (Referência C#)

Outros recursos

LINQ (consulta integrada à linguagem)

LINQ to SQL

LINQ to DataSet

LINQ to XML