فقرة From ( مرجع #C )
يجب أن يبدأ تعبير الاستعلام بجملة from. بالإضافة إلى ذلك، يمكن أن يحتوي تعبير الاستعلام على sub-queries تبدأ أيضاً بالجملة from. الجملة from تحدد التالي:
مصدر البيانات الذي سوف يشغل الاستعلام أو الاستعلام الإضافي.
المحلي متغير النطاق الذي يمثل كل عنصر بتسلسل المصدر.
يتم ترميز كلا من متغير النطاق ومصدر البيانات بشدة. المصدر بيانات المشار إليه في الجملة from يجب أن يتضمن نوع من IEnumerable, IEnumerable<T>، أو نوع مشتق مثل IQueryable<T>.
ففي المثال التالي، numbers هو مصدر البيانات، num و هو متغير النطاق. لاحظ أن كلا المتغيران تم ترميزهما بشدة حتى خلال varيتم استخدام الكلمة الأساسية .
class LowNums
{
static void Main()
{
// A simple data source.
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
// Create the query.
// lowNums is an IEnumerable<int>
var lowNums = from num in numbers
where num < 5
select num;
// Execute the query.
foreach (int i in lowNums)
{
Console.Write(i + " ");
}
}
}
// Output: 4 1 3 2 0
متغير النطاق
يعين المترجم نوع متغير النطاق عندما يطبق مصدر البيانات IEnumerable<T>. على سبيل المثال، إذا كان المصدر يحتوي على نوع IEnumerable<Customer>، فإنه يستدل بمتغير النطاق ليكون Customer. المرة الوحيدة التي يتوجب عليك فيها تحديد النوع بشكل صريح هي عندما يكون المصدر غير عام IEnumerable اكتب مثل ArrayList. لمزيد من المعلومات، راجع كيفية: الاستعلام ArrayList مع LINQ.
في المثال السابق num تمت الإشارة إليه ليكون من نوع int. لأن متغير النطاق تم ترميزه بشده، يمكنك الاتصال بالأساليب عليه أو استخدامه في عمليات أخرى. على سبيل المثال، بدلاً من الكتابة select num، يمكنك كتابة select num.ToString() لاستدعاء تعبير الاستعلام, لاعاده تسلسل من السلاسل بدلاً من الأعداد الصحيحة. أو قد تقوم بكتابة select n + 10 ليجعل التعبير يعيد التسلسل 14, 11، 13, 12، 10. لمزيد من المعلومات، راجع جملة select (مرجع #C).
متغير النطاق يشبه تكرار متغير في العبارة foreach باستثناء الفرق الهامة: متغير النطاق لا يخزن فعلياً البيانات من المصدر. أنها مجرد ملاءمة نحوية تفعّل الاستعلام لوصف ما قد يحدث عندما يتم تشغيله. لمزيد من المعلومات، راجع مقدمة إلى استعلامات LINQ (C#).
مركب من العبارات
في بعض الحالات،لكل عنصر في تسلسل المصدر قد يكون نفسه تسلسل أو يحتوي على تسلسل. على سبيل المثال، قد يكون مصدر بياناتك IEnumerable<Student> حيث يكون كل كائن للطالب في التسلسل يحتوي على قائمة نتائج الاختبارات. للوصول للقائمة الداخلية لكل عنصر Student ، يمكنك استخدام مركبة العبارات from . التقنية يشبه استخدام العبارات المتداخلة foreach . يمكنك إضافة حيثأو ترتيب حسب عبارات إما إلى عبارة from لتصفية النتائج. يظهر المثال التالي تسلسل العناصر Student كل منها يحتوي على الداخلية List من أو الإعداد الصحيحة التي تمثل نقاط الاختبار. للوصول للقائمة الداخلية , استخدم مركبة الجملة from. يمكنك إدراج عبارات بين العبارتينfrom إذا لزم الأمر.
class CompoundFrom
{
// The element type of the data source.
public class Student
{
public string LastName { get; set; }
public List<int> Scores {get; set;}
}
static void Main()
{
// Use a collection initializer to create the data source. Note that
// each element in the list contains an inner sequence of scores.
List<Student> students = new List<Student>
{
new Student {LastName="Omelchenko", Scores= new List<int> {97, 72, 81, 60}},
new Student {LastName="O'Donnell", Scores= new List<int> {75, 84, 91, 39}},
new Student {LastName="Mortensen", Scores= new List<int> {88, 94, 65, 85}},
new Student {LastName="Garcia", Scores= new List<int> {97, 89, 85, 82}},
new Student {LastName="Beebe", Scores= new List<int> {35, 72, 91, 70}}
};
// Use a compound from to access the inner sequence within each element.
// Note the similarity to a nested foreach statement.
var scoreQuery = from student in students
from score in student.Scores
where score > 90
select new { Last = student.LastName, score };
// Execute the queries.
Console.WriteLine("scoreQuery:");
foreach (var student in scoreQuery)
{
Console.WriteLine("{0} Score: {1}", student.Last, student.score);
}
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/*
scoreQuery:
Omelchenko Score: 97
O'Donnell Score: 91
Mortensen Score: 94
Garcia Score: 97
Beebe Score: 91
*/
استخدام فقرة From متعددة لاتمام الانضمام.
مركبة الفقرةfrom تستخدم للوصول إلى المجموعات الداخلية في مصدر البيانات الواحد. ومع ذلك، يمكن أن يحتوي الاستعلام على عدة عبارات إنشاء from الذي ينشئ استعلامات التكميلية من مصادر مستقلة. يتيح لك هذا الأسلوب إلى إجراء أنواع معينة من عمليات ربط غير ممكنة باستخدام جملة الصلة bb311040(v=vs.100).md.
يظهر المثال التالي كيف لعبارتين from يمكن استخدامهما عبر نموذج المشاركة الكامل من مصدرين من مصادر البيانات.
class CompoundFrom2
{
static void Main()
{
char[] upperCase = { 'A', 'B', 'C'};
char[] lowerCase = { 'x', 'y', 'z'};
var joinQuery1 =
from upper in upperCase
from lower in lowerCase
select new { upper, lower};
var joinQuery2 =
from lower in lowerCase
where lower != 'x'
from upper in upperCase
select new { lower, upper };
// Execute the queries.
Console.WriteLine("Cross join:");
foreach (var pair in joinQuery1)
{
Console.WriteLine("{0} is matched to {1}", pair.upper, pair.lower);
}
Console.WriteLine("Filtered non-equijoin:");
foreach (var pair in joinQuery2)
{
Console.WriteLine("{0} is matched to {1}", pair.lower, pair.upper);
}
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
Cross join:
A is matched to x
A is matched to y
A is matched to z
B is matched to x
B is matched to y
B is matched to z
C is matched to x
C is matched to y
C is matched to z
Filtered non-equijoin:
y is matched to A
y is matched to B
y is matched to C
z is matched to A
z is matched to B
z is matched to C
*/
للحصول على معلومات أكثر حول عمليات الصلة االتي تستخدم العبارات المتعددة from, راجع كيفية القيام بما يلي: تنفيذ عمليات ربط مخصصة (دليل البرمجة لـ #C).
راجع أيضًا:
المبادئ
LINQ استعلام التعبيرات (C# البرمجة الدليل)