Layered design in software engineering

3-Expression Trees

 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.  




تعليقات