Aracılığıyla paylaş


LINQ (C#) ile veri dönüşümleri

Dil ile Tümleşik Sorgu (LINQ)yalnızca veri alma hakkında değil.Veri dönüştürme için de güçlü bir araçtır.Kullanarak bir LINQ , sorgu giriş ve yeni bir çıkış sırası oluşturmak için birçok yolla değiştirmek gibi bir kaynak sırası kullanabilirsiniz.Öğeleri sıralama ve gruplandırma değiştirme olmadan sıra kendisini değiştirebilirsiniz. Ancak belki de en güçlü özelliklerinden biri LINQ yeni türleri oluşturma yeteneği sorgudur.Bu gerçekleştirilir seçin yan tümcesi.Örneğin, şu görevleri yerine getirebilirsiniz:

  • Birden çok Giriş dizilerinden yeni bir türe sahip bir tek çıkış sırası birleştirin.

  • Öğeleri yalnızca bir veya daha çok kaynak dizideki her öğe özelliklerini oluşur çıkış sıraları oluşturun.

  • Öğeleri kaynak veriler üzerinde gerçekleştirilen işlemlerin sonuçlarını oluşur çıkış sıraları oluşturun.

  • Çıkış sıraları farklı bir biçimde oluşturun.Örneğin, xml sql satırları veya metin dosyalarını dönüştürebilirsiniz.

Bunlar sadece birkaç örnektir.Kuşkusuz, bu dönüştürmeler çeşitli şekillerde aynı sorgu içinde birleştirilebilir.Ayrıca, bir sorgunun çıkış sırası için yeni bir sorgu giriş dizisi kullanılabilir.

Birden çok girdi bir çıkış sırasına katılma

Kullanabileceğiniz bir LINQ , birden fazla giriş dizisindeki öğeleri içeren bir çıkış sırası oluşturmak için sorgu.Aşağıdaki örnek, nasıl bir araya iki bellek içi veri yapılarını gösterir, ancak aynı ilkeleri, xml veya sql veya DataSet kaynaklardan gelen verileri birleştirmek için uygulanabilir.Aşağıdaki iki sınıf türleri varsayılmaktadır:

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

Aşağıdaki örnek sorgu gösterir:

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

Daha fazla bilgi için, bkz. JOIN yan tümcesi (C# Reference) ve yan tümcesi (C# Reference) seçin.

Her kaynağı öğesi kümesini seçme

Kaynak dizideki her öğenin bir alt kümesini seçmek için iki ana yolu vardır:

  1. Kaynak öğenin tek bir üye seçmek için nokta işlemini kullanıyorsunuz.Aşağıdaki örnekte, yaptığınızı varsayar bir Customer nesnesini içeren adlı bir dize gibi birçok ortak özelliği City.Bu sorgu çalıştırıldığında, çıktı bir dizeler dizisi üretecektir.

    var query = from cust in Customers
                select cust.City;
    
  2. Kaynak öğenin birden fazla özelliği içeren öğeleri oluşturmak için nesne Başlatıcısı adlandırılmış nesne veya anonim bir türü ile kullanabilirsiniz.Aşağıdaki örnek, her iki özellik kapsüllemek için anonim bir tür kullanımı gösterir Customer öğesi:

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

Daha fazla bilgi için, bkz. Nesne ve koleksiyon Başlatıcı (C# Programlama Kılavuzu) ve Anonim türleri (C# Programlama Kılavuzu).

Bellek içi nesneleri xml dönüştürme

LINQsorgularını kolaylaştırır bellek içi veri yapılarını, sql veritabanları arasında veri dönüştürme ADO.NET veri kümeleri ve xml akışları veya belgeler.Aşağıdaki örnek bir bellek içi veri yapısı içinde nesneleri xml öğelerine dönüştürür.

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

Aşağıdaki xml çıktısı kod üretir:

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

Daha fazla bilgi için bkz. Creating XML Trees in C#.

Kaynak öğeler üzerinde işlemler gerçekleştirme

Çıkış sırası herhangi bir öðe ya da kaynak serisinden öğesi özellikleri içermeyebilir.Çıktı, bunun yerine kaynak öğeler giriş bağımsız değişkenleri kullanarak hesaplanan değerler dizisi olabilir.Çalıştırıldığında, aşağıdaki basit sorgu, bir dizi türü öğeler kaynak sıralamasına dayanan bir hesaplama değerlerini temsil eden dizeleri çıktı double.

[!NOT]

Sorguyu başka bir etki alanına çevrilmesi, sorgu ifadelerde yöntemleri çağırma desteklenmiyor.Sıradan bir C# yöntemi gibi çağrılamıyor LINQ to SQL sql Server için içerik yok olduğundan.Ancak, saklı yordamlar eşlemek için yöntemleri ve olanlar çağırın.Daha fazla bilgi için bkz. Stored Procedures: Mapping and Calling (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
*/

Ayrıca bkz.

Görevler

Nasıl yapılır: birleşimler (Visual Basic) kullanarak verileri LINQ ile birleştirmek

Başvuru

yan tümcesi (C# Reference) seçin

Kavramlar

LINQ sorgu ifadelerini (C# Programlama Kılavuzu)

Diğer Kaynaklar

LINQ (dil ile bütünleşik sorgu)

LINQ to SQL

LINQ to DataSet

LINQ to XML