تحويلات بيانات مع (#LINQ (C

مجموعة ميزات Language-Integrated Query‏ (LINQ) ليس فقط لاسترداد بيانات. هو أيضاً أداة قوية لتحويل بيانات. باستخدام استعلام LINQ، يمكنك استخدام تسلسل مصدر كإدخال‬ وتعديله في العديد من الطرق لإنشاء تسلسل إخراج جديد. يمكنك تعديل التسلسل نفسه دون تعديل العناصر نفسها بواسطة الفرز والتجميع. لكن ربما أن الميزة الأكثر فعالية لاستعلامات LINQ هي القدرة على إنشاء أنواع جديدة. ويتم تحقيق ذلك في بند select. على سبيل المثال، يمكنك تنفيذ المهام التالية:

  • دمج عدة تسلسلات إدخال في تسلسل إخراج واحد له نوع جديد.

  • إنشاء تسلسلات إخراج عناصرها تتألف من خاصية أو أكثر لكل عنصر في تسلسل المصدر.

  • إنشاء تسلسلات إخراج عناصرها تتكون من نتائج العمليات المنفذه على بيانات المصدر.

  • إنشاء تسلسلات إخراج بتنسيق مختلف. على سبيل المثال، يمكنك تحويل بيانات من صفوف SQL أو ملفات نص في XML.

هذه بعض الأمثلة فقط. بالطبع، يمكن دمج هذه التحويلات بعدة طرق في نفس الاستعلام. علاوة على ذلك، يمكن استخدام تسلسل إخراج استعلام واحد كتسلسل إدخال للحصول على استعلام جديد.

ربط عدة إدخالات في تسلسل إخراج واحد

يمكنك استخدام استعلام LINQ لإنشاء تسلسل إخراج يحتوي على عناصر من تسلسل إدخال واحد أو أكثر. المثال التالي يظهر كيفية جمع بنيتان بيانات في الذاكرة، ولكن يمكن تطبيق المبادئ نفسها لجمع بيانات من مصادر XML أو SQL أو DataSet. افترض فئتين الأنواع التالية:

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

يوضح المثال التالي الاستعلام:

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

للمزيد من المعلومات، راجع جملة الصلة (C# مرجع) وحدد عبارة (C# مرجع).

تحديد مجموعة فرعية من كل عنصر مصدر

هناك طريقتان أساسيتان لتحديد مجموعة فرعية لكل عنصر في تسلسل المصدر:

  1. لتحديد عضو واحد فقط من عنصر المصدر, استخدم عملية dot. في المثال التالي، افترض أن كائن Customer يحتوي على خصائص عامة عدة بما في ذلك سلسلة مسماة City. عند التنفيذ، هذا الاستعلام سوف ينتج تسلسل إخراج من سلاسل.

    var query = from cust in Customers
                select cust.City;
    
  2. لإنشاء عناصر تحتوي على أكثر من خاصية واحدة من عنصر المصدر، يمكنك استخدام مُهيئ كائن مع إما كائن مسمى أو نوع مجهول. يظهر المثال التالي استخدام نوع مجهول لتغليف خاصيتين من كل عنصر Customer:

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

للمزيد من المعلومات، راجع كائن و مجموعة المُهيآت (C# البرمجة الدليل) وأنواع مجهول (C# البرمجة الدليل).

تحويل كائنات في الذاكرة إلى XML

استعلامات LINQ تجعل من السهل تحويل بيانات بين بنية البيانات في الذاكرة، قواعد بيانات SQL، مجموعات بيانات ADO.NET، و تدفقات أو مستندات XML. المثال التالي يحول كائنات في بنية بيانات في الذاكرة إلى عناصر 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();
    }
}

تنتج التعليمات البرمجية إخراج 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>

لمزيد من المعلومات، راجع Creating XML Trees in C# (LINQ to XML).

تنفيذ عمليات على عناصر المصدر

قد لا يحتوي تسلسل إخراج على أي عناصر أو خصائص عنصر من تسلسل المصدر. بدلاً من ذلك قد يكون تسلسل الإخراج عبارة عن قيم تم حسابها باستخدام عناصر المصدر كوسائط إدخال. عندما يتم تنفيذ الاستعلام البسيط التالي، يقوم بإخراج تسلسل من سلاسل تمثل قيمها عملية حسابية استناداً إلى تسلسل المصدر من عناصر من نوع double.

ملاحظة

استدعاء الأساليب ليس مدعوم في تعبيرات الاستعلام إذا كان سيتم ترجمت الاستعلام إلى مجال أخر. على سبيل المثال، لا يمكنك استدعاء أسلوب #C عادي في مكون LINQ to SQL لأن خادم SQL لا يوجد سياق خاص به. ومع ذلك، يمكنك تعيين إجراءات مخزنة لأساليب و استدعائهم. لمزيد من المعلومات، راجع 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
*/

راجع أيضًا:

المهام

كيفية: ضم البيانات مع LINQ باستخدام انضمام (Visual Basic)

المرجع

حدد عبارة (C# مرجع)

المبادئ

تعبيرات الاستعلام LINQ (C# البرمجة الدليل)

موارد أخرى

مجموعة ميزات Language-Integrated Query (LINQ)

LINQ to SQL

LINQ to DataSet

LINQ to XML