- الحصول على الرابط
- X
- بريد إلكتروني
- التطبيقات الأخرى
- الحصول على الرابط
- X
- بريد إلكتروني
- التطبيقات الأخرى
Expression Tree
عبارة عن tree data structure تمثل ال code.
ببساطة الكود اللى كتبناه هيبقى عباره عن data محفوظة ومنظمة فى tree data structure , وبالطبع دى من ال features المهمه اللى بتستخدمها LINQ.
وال Compiler هو المسؤول عن تحويل ال code إالى Expression Tree .
ال Compiler علشان يحول الـ Code إلى Expression Tree لازم يكون المتغير من نوع : <Expression<TDelegate
مثال:
Expression<Func<int, bool>> exprTree = num => num < 5;
ال Compiler هيحول ال code اللى من نوع Expression إلى Tree Data Structure ,وممكن نستخدم exptree علشان نوصل للبيانات اللى موجوده فى ال data structure.
// Create an expression tree. Expression<Func<int, bool>> exprTree = num => num < 5; // Decompose the expression tree. ParameterExpression param = (ParameterExpression)exprTree.Parameters[0]; BinaryExpression operation = (BinaryExpression)exprTree.Body; ParameterExpression left = (ParameterExpression)operation.Left; ConstantExpression right = (ConstantExpression)operation.Right; Console.WriteLine("Decomposed expression: {0} => {1} {2} {3}", param.Name, left.Name, operation.NodeType, right.Value); // output: // Decomposed expression: num => num LessThan 5
يبقى انا قادر اوصل لل data اللى موجوده فى ال tree وال data بتمثل الكود وهو عبارة عن lambda expression function.
مثال : Expression<Func<int, bool>> isPositiveExpression = int32 => int32 > 0
كيف تستفيد LINQ من ال Expression Tree ؟
لو استخدمت ال Entity Framework فاكيد استخدمت LINQ.
مثال:
using (var context = new BloggingContext()) { var blog = context.Blogs .Single(b => b.BlogId == 1); }
ال BloggingContext هى المسؤوله عن التواصل مع ال Database , واحنا كتبنا Query تسترجع Blog بأستخدام ال id .
ازاى بقى ال Entity Framework هينفذ الـ Single Method.
دلوقتى ال data محفوظة فى ال database ومش موجوده عندنا علشان ننفذ الـ Single Method.
ممكن ال Entity Framework يرسل SQL Command ويسترجع كل الداتا المحفوظة في الـ Blog Table وهيكونوا عباره عن collection of objects وبالتالى نقدر ننفذ الـ Single method.
وطبعاً دا حل غير عملى , تخيل تسترجع كل الداتا المحفوظة فى Table لعمل لهم Filter وتختار Object واحد.
الحل الأمثل والأنسب أن ال Entity Framework يرسل الـ LINQ Query إلى DBMS سواء Sql Server أو غيره.
وال DBMS مسؤول عن تنفيذ ال Query ويرجع لينا الـ Result النهائية كالمعتاد .
والسؤال دلوقتى ازاى الـ DBMS هيفهم الـ Single Method اللى كتبناها ؟
الـ DBMS بينفذ ال SQL Query ولا يعرف الـ Single Method والحل يأتي مع ال Expression.
مهمة من مهمات الـ Entity Framework هو تحويل الـ LINQ Query إلى SQL Commands من اجل ارسالها إالى الـ DBMS وتنفيذها.
وطبعاً ال Entity Framework يستخدم ال Expression علشان يقدر يقرأ الكود ويحوله لـ SQL Command.
هل ال Entity Framework قادر على تحويل كلLINQ Query Method لـ SQL command المكافىء ليهم.
والإجابة هي لا.
لو انت بتستخدم LINQ Method وكان ليها argument من نوع Expression يبقى ال Entity Framework قادر على تحويلها ل SQL Command وارسالها لـ DBMS لتنفيذها.
اما لو مفيش اى نسخه من method بتستقبل Expression تبقى متأكد أن ال method يتم تنفيذها على collection of objects فى ال Ram.
تعليقات
إرسال تعليق