Layered design in software engineering

6-IEnuramble interface Vs IQueryable interface

كتبت عن ال Extension Method  وقلت أن الـ LINQ  بتضيف ال method الخاص بيها  باستخدام الـ Extension Method.

ال Data Structures فى #C  مثل List و Array  , بيعملوا implement ل  IEnuramble interface و LINQ بتضيف ال methods لل IEnuramble interface بالتالى اى class بتعمل implement ل IEnuramble interface  هتقدر تستخدم اى Extension Method ثم اضافتها بواسطة LINQ.

مثال:

  • public class List<T> : System.Collections.Generic.ICollection<T>,      System.Collections.Generic.IEnumerable<T>,  System.Collections.Generic.IList<T>, System.Collections.Generic.IReadOnlyCollection<T>, System.Collections.Generic.IReadOnlyList<T>, System.Collections.IList


اضافة ال where method إلى الـ IEnuramble interface


  • public static System.Collections.Generic.IEnumerable<TSource> Where<TSource> (this     System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,bool> predicate)
  •   

وبكدا اى class بتعمل implement لل IEnuramble interface هتقدر تستخدم الـ where.

مثال:


  • List<string> fruits = new List<string> { "apple", "passionfruit", "banana", "mango", "orange", "blueberry", "grape", "strawberry" } 
  • IEnumerable<string> query = fruits.Where(fruit => fruit.Length < 6)


 IQueryable interface

ال  IQueryable interface  ب extend من ال IEnuramble interface بالتالى اى Extension method هيتم اضافتها ل IQueryable interface  بواسطة LINQ هتكون متاحه لأى class بتعمل implement ل IEnuramble او IQueryable.


  • public interface IQueryable : System.Collections.IEnumerable
  •   






طب ليه LINQ تضيف Extension methods ل IEnuramble وفى نفس الوقت تضيف ال Extension method تانى لل IQueryable Interface  مثل Where Method.

احنا شفنا ال Where Extension Method التى تم اضافتها إلى IEnuramble Interface ,بص عليها هتجد أن ال predicate من نوع Func .

تعالى بقى نشوف Where Extension Method المضافه إلى IQueryable interface.


  • public static System.Linq.IQueryable<TSource> Where<TSource> (this  
  • , System.Linq.IQueryable<TSource> source     
  • (System.Linq.Expressions.Expression<Func<TSource,bool>> predicate     

شوف الـ Predicate من نوع ايه , هتجده من نوع Expression وكتبت عن ال Expression وليه بنستخدمه.

ال IQueryable Interface  يثم اضافة لها  الـ LINQ Methods  التى يتم  استخدامها وعمل implementation لها من قبل query provider مثل الـ Entity Framework .

والمختصر أن Entity Framework يستخدم LINQ Extension methods المضافه إلى IQueryable Interface  بحيث لو هيتم ارسال  SQL Command ل Relational database هيكون قادر انه يقرأ الكود اللى احنا كتبناه باستخدام ال Expression Tree ثم يحوله ل SQL Command. 

 

......


تعليقات