سؤال

يتحدث غير C# الدهاء مبرمج, أنا الغريب تقييم دلالات استعلامات LINQ كما يلي:

var people = from p in Person
             where p.age < 18
             select p

var otherPeople = from p in people
                  where p.firstName equals "Daniel"
                  select p

على افتراض أن Person هو ADO الكيان الذي يحدد age و firstName الحقول ، أن هذا ما تفعله من قاعدة بيانات الناحية ؟ على وجه التحديد ، people الاستعلام يتم تشغيلها لإنتاج هيكل في الذاكرة ثم يتم الاستعلام عنها من قبل otherPeople الاستعلام?أو بناء otherPeople مجرد سحب البيانات المتعلقة الاستعلام من people ومن ثم إنتاج بيانات جديدة-أطل query ؟ لذا, إذا لم يتحرك على كل هذه الاستفسارات ، كم من البيانات SQL سيكون التنفيذ ؟

هل كانت مفيدة؟

المحلول

هم composable.وهذا ممكن لأن استعلامات LINQ هي في الواقع تعبيرات (قواعد البيانات) الذي ينق مقدمي مثل LINQ إلى SQL يمكن تقييم وتوليد SQL المناظرة.

لأن LINQ الاستعلامات بتكاسل تقييم (مثلا ، لن تحصل على تنفيذها حتى أكثر من تكرار العناصر) ، رمز أظهرت لن تلمس الواقع قاعدة البيانات.ليس قبل أن تكرار عبر otherPeople أو الناس سوف SQL يتم إنشاؤها وتنفيذها.

نصائح أخرى

نعم, الاستعلام الناتج يتكون.وهي تشمل كامل جملة where.تشغيل SQL التنميط انها محاولة وانظر لنفسك.

Linq يفعل ذلك من خلال التعبير الأشجار.أول linq بيان ينتج التعبير شجرة ؛ لا تنفيذ الاستعلام.الثاني linq بيان يبني على التعبير شجرة أنشأها أول.البيان أعدم فقط عند تعداد أدى جمع.

var people = from p in Person
             where p.age < 18
             select p

يترجم إلى:

SELECT [t0].[PersonId], [t0].[Age], [t0].[FirstName]
FROM [dbo].[Person] AS [t0]
WHERE [t0].[Age] < @p0

حيث @p0 يحصل إرسالها من خلال 18

var otherPeople = from p in people
                  where p.firstName equals "Daniel"
                  select p

يترجم إلى:

SELECT [t0].[PersonId], [t0].[Age], [t0].[FirstName]
FROM [dbo].[Person] AS [t0]
WHERE [t0].[FirstName] = @p0

حيث @p0 يحصل إرسالها من خلال "دانيال"

var morePeople = from p1 in people
                 from p2 in otherPeople
                 where p1.PersonId == p2.PersonId
                 select p1;

يترجم إلى:

SELECT [t0].[PersonId], [t0].[Age], [t0].[FirstName]
FROM [dbo].[Person] AS [t0], [dbo].[Person] AS [t1]
WHERE ([t0].[PersonId] = [t1].[PersonId]) AND ([t0].[Age] < @p0) AND ([t1].[FirstName] = @p1)

حيث @p0 18, @p1 هو "دانيال"

عندما تكون في شك ، اتصل ToString() على IQueryable أو إعطاء TextWriter إلى DataContext سجل الممتلكات.

people و otherPeople تحتوي على كائنات من نوع IQueryable<Person>.

إذا كنت تكرار على حد سواء ، منفصلا ، فإنه سيتم تشغيل اثنين من الاستفسارات.إذا كنت فقط تكرار عبر otherPeople, ، فإنه سيتم تشغيل المتوقع الاستعلام مع اثنين من حيث الشروط.

إذا كنت تفعل .ToList() على people واستخدام عاد List<Person> في الاستعلام الثاني بدلا من الناس ، يصبح LINQ إلى الأشياء وليس SQL يتم تنفيذها.

هذا السلوك يشار إلى تأجيل التنفيذ.يعني لا الاستعلام يتم حتى الحاجة إليه.قبل التنفيذ فهي مجرد التعبير الأشجار التي على التلاعب صياغة نهائية الاستعلام.

كل هذه الأسئلة سوف ينفذ عندما كنت سوف محاولة الوصول إلى النتائج النهائية.يمكنك محاولة لعرض الأصلي SQL التي تم إنشاؤها من DataContext خصائص الكائن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top