إبذأ LINQ كيفيت انؼ م بانتم يت انجذيذة نإلستؼالياث باستخذاو نغت #C Linverno 2008 1
بسى اهلل انرد انرديى صذق اهلل انؼظيى ع سح ا ز ثخ 2
يمذيت زا ا زبة عضء غ د خذ خ اإلعال ا غ ي. ز ي ك غب ٠, ي زلغ ث أساد اإل زلبع. ؿيش ؾذد أ وظ س ػ ٠ كئخ خبطخ. ي ي ايؼب غخ ر صيؼ ؿجؼ اإلهزجبط ثأ ط سح ب ذ. ث األكؼ أ يز ر صيؼ شش هذس اإلعزبػ. ار ٠ يغزيغ أ يوذ زت ػ يخ بكؼخ أ ال يزأخش ػ زا. كخيش - ب رؼ رؼ ا ؼ ػ. زا ا زبة يظ جزذأي ك ٠ ا جش غخ. الثذ دساعخ ا جش غخ ا شيئيخ أ ال ص دساعخ DotNet ثؼغ SQL أعبعيبد ه اػذ ا جيب بد, ؼشكخ ا و ي ػ.XML األه ػ.ADO.NET ؽز ٠ رز اعزيؼبة زا ا زبة اعزيؼبة عيذ. ك يوذ رو يخ عذيذح ك ٠ اإلعزؼال ػ ا جيب بد ظبدس ا جيب بد ا خز لخ. يوذ ششػ لب ي اعزخذا يضاد بد ا ذ د ذ ا ؾذيش ( 3.0 #C( زا ا زبة يؾز ػ ٠ 50 طلؾخ روشيجب. وذ ساػي ب أال ي بى أ صيبداد ك ٠ ا ششػ رإد ا ٠ كوذ ا زش يض أ اإلثزؼبد ػ ػ ع ا زبة. ز ي عبء ا زبة ش ض شج شب ألعبعيبد ا زو يخ. بى ا ؼذيذ ا زت ا ز ٠ رضيذ طلؾبر ب ػ 500 طلؾخ. ك ٠ ا ؾويوخ ي ئخزظبس ب ا ٠ سثغ زا ا ؼذد. ز ي اثزؼذ ب ػ ب يظ داػ ٠ هذ ب ػ ب خب ظب ثذ رؼويذاد. ع ف رغذ ا زا ا زبة يزؾذس ػ ع ف وذ زبة أخش ئ شبء اهلل ا غذيذ ك ٠ #C LINQ To SQL كوؾ. ك ٠ ا غزوج ا وشيت عذا يزؾذس ػ.LINQ To XML شع اهلل أ ي زا ا زبة لؼب ب ك ٠ ا ذ يب األخشح. لؼب غ يغ ا غ ي. 3
ان ذت ياث انفصم األ ل ييزاث نغت #C انفصم انثا ى اساسياث LINQ انفصم انثانث LINQ To SQL 4
انفصم األ ل ييزاث نغت #C ايؼب يوذ ز ا لظ ا يضاد ا غذيذح ك ٠ خ C#3.0, ثؼغ ا يضاد ك ٠ C# 2.0.C# 1.0 5
ا ؼشكخ ا ب خ ثب زؾغي بد ا ز ٠ ادخ ذ ػ ٠ خ #C ك ٠ اإلطذاس ا ضب ش ب يغذ ػش سيخ إلعزخذا.LINQ غ ر ي, ع ف وذ طق هظيش يضاد #C )اثزذاءا #C x.1 ؽز ٠ #C( 3.0 ا ز ٠ ع ف رؾزبع ب ٠ رل ث ػ ػ يليخ ا ؼ غ LINQ ثبهظ ٠ لبءح. ئرا هشسد أ رزخ ٠ هشاءح زا ا غضء, ي ي ا رؼ د شح أخش ك ٠ أ هذ ػ ذ ب رؾزبط ا ٠ ك ب ا ز يؾذس ثب ؼجؾ ثذاخ عLINQ. فى زا انمسى, س ف م و بت ضيخ بؼض ييزاث #C ان ت بان سبت ن generics, :LINQ.anonymous methods, yield, IEnumerable interface البذ ي أ تف ى ز ان فا يى كى تستطيغ ف ى.LINQ C# 2.0 Generics ئر اسد ب ػ دا خ رو ثجبػخ ػ بطش array ا ع,int ك زا أ ش ثغيؾ. ا ظش ا د ا زب ٠ : Static void PrintArray( int[] inputarray) foreach ( int element in inputarray ) Console.Write(element + " "); Console.WriteLine("\n"); ك ٠ لظ ا جش ب ظ ئرا اسد ب دا خ أخش رو ثجبػخ array ا ع,double ك زا ا ش أثغؾ. لظ ا ذا خ ا غبثوخ ث لظ األع غ ريش ع ا جيب بد ك ٠ ػ بطش ا ذا خ. ب زب ٠ : زت Static void PrintArray( double[] inputarray) foreach ( double element in inputarray ) Console.Write(element + " "); Console.WriteLine("\n"); ئرا اسد ب دا خ أخش رو ث لظ ا ؼ يخ ػ ٠ ا ع ثيب بد أخش, أ ظش ا د ا زب ٠, زا ا د جش ب ظ ب : ك ؾ و ثؼ دا خ عذيذح ع. 6
using System; class OverloadedMethods static void Main( string[] args ) int[] intarray = 1, 2, 3, 4, 5, 6 ; double[] doublearray = 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7 ; char[] chararray = 'H', 'E', 'L', 'L', 'O' ; Console.WriteLine( "Array intarray contains:" ); ProntArray( intarray ); Console.WriteLine( "Array doublearray contains:" ); ProntArray( doublearray ); Console.WriteLine( "Array chararray contains:" ); ProntArray( chararray ); Static void PrintArray( int[] inputarray) foreach ( int element in inputarray ) Console.Write(element + " "); Console.WriteLine("\n"); Static void PrintArray( double[] inputarray) foreach ( double element in inputarray ) Console.Write(element + " "); Console.WriteLine("\n"); Static void PrintArray( char[] inputarray) foreach ( char element in inputarray ) Console.Write(element + " "); Console.WriteLine("\n"); ك ٠ ا جش ب ظ ا غبثن ه ب ثؼ صالصخ د ا رو ث لظ ا ؼ غ ريش ع ا ؼ بطش ا ز ٠ رأخز ب ا ذا خ. ب كؼ ب زا يغ ٠,Overload يؼ ٠ أ ػذح د ا لظ األع ع ػ بطش خز لخ. ك ٠ ا د ا غبثن ه ب ثؼ صالصخ ظل كبد )array( صالصخ ا اع خز لخ.int, double, char ص اعزذػي ب دا خ غ اػبئ ب ا ع ا بعت ب. زا ؿجيؼ ٠ ؼزبد. ا غذيذ ك ٠ #C 2.0 ا ب غزيغ ػ لظ ا جش ب ظ ا غبثن ا ٠ ػ ا ؼذيذ ا ذ ا. رنك بذانت ادذة فمط, د ا ؾبعخ )T ه ب ثزيش اع األ اع ب ا ٠ ؽشف ا ( ب زب ٠ : اػذ ب زبثخ ا ذا خ ثؾيش رأخز ا ع T كيظجؼ ا د Static void PrintArray( T[] inputarray) 7
foreach ( T element in inputarray ) Console.Write(element + " "); Console.WriteLine("\n"); انك د انسابك نيس صذيذا ي ان اديت انهغ يت ( انخاصت بهغت انبريجت(, نك يشرح ان ؼ ى نيس أكثر. ا ب ا د ا ظؾيؼ ك ي زت ثب شيوخ ا زب يخ: Static void PrintArray<T>( T[] inputarray) foreach ( T element in inputarray ) Console.Write(element + " "); Console.WriteLine("\n"); الؽظ ئػبكخ <T> ثؼذ أع ا ذا خ جبششح, ص اعزخذا ؽشف )T( زؼجيش ػ ا ع ثذاخ ا ذا خ. ؿجؼب ي ب زبثخ أ س ض أخش ؿيش ا T, ي ع ف رؼزبد ػ ٠ سؤيخ زا ا ؾشف ضيشا ك ٠ ا ؼذيذ ا زت ا زو يخ, عبئ ا غبػذح ا خز لخ. ز ي ي ظؼ ثبعزخذا زا ا ؾشف. ص ثؼذ ر ي ي ي اعزذػبء ر ي ا ذا خ ثؼذح ا اع خز لخ ا ؼ بطش: PrintArray( intarray ); PrintArray( doublearray ); printarray( chararray ); ك ٠ ز ا ؾب خ يو ا زشع ( )Compiler رز بعت غ ا ع ا ذخ ا ي ب. ثبعز زبط ع ا جيب بد ا ز ٠ اػيذ ذا خ, ص ر ليز ا ذا خ ثؾيش زا ا وظ د ة.Generic ئ شبء بئ إلعزخذا بد ا ؼب خ. Delegates ك لزشع ا بى دا خ ك ٠ د يز زبثز, ر ي ا ذا خ ع ف رغزذػ ٠ ك ٠ ب ؾذد ك ٠ ا د. ا ذ ا رغزذػ ٠ ثأ ي زت اع ب ك ٠ ا ب ا ز شيذ. ص ثؼذ ر ي و ثزشي ا د أ رشع ز هج ا زشع, شح يز رشي كي ب ا د يز اعزذػبء ا ذا خ ػ ذ لظ ا وخ أ ا ب ا ز زج ب اع ب كي. برا ؽذس ب ػ ذ ب ػذح د ا شيذ أ غزذػ ٠ دا خ اؽذح كوؾ كوب ؾذس ؼي. بى ا ؼذيذ.Switch بى ؽ أكؼ اعزخذا,IF أ ع خ ا شم, ك ا ا غزخذ ع خ.Delegate 8
يؼزجش ا Delegate ا شين ا ز رؼ ث األؽذاس. ا Delegate يؼزجش إشش ذ ا.)Pointer( ك يو ثز شيش ا شعغ ا خبص ثب ذ ( ب ا ذا خ ك ٠ ا زا شح( رشي ر ي ا ذ ا ثذ اعزذػبء ب طشاؽخ. ا ؾ ا خبص ثب زظشيؼ ػ ا : Delegate [access-modifier] delegate result-type identifier( [parameters] ); ؽيش : ؼشف ا ذخ ا ٠ ا بئ ( ضيذ ا ؼ بد اسعغ ا ٠ اعبعيبد خ #C( : access-modifier : Delegate خ لزبؽيخ صبثزخ :Result-type ع ا جيب بد ا ز ٠ ي زغ ب ا Delegate ا ز ٠ رزبثن غ ا ذا خ ا ز ٠ يشيش ا ي ب Delegate أع ا :identifier :Paramters ا ؼ بطش ا ز ٠ رأخز ب ا ذا خ ا ز ٠ ع ف رغزذػ ٠ ا ضب ا زب ٠ رظشيؼ ػ Delegates public delegate int mydelegate(double D); ك ٠ ا ضب ا غبثن, ه ب ثب زظشيؼ ػ Delegate اع mydelgegate ا ز ي أ غزخذ زشي ا دا خ رؼ د ثوي خ ا ع int رأخز ػ ظش اؽذ ا ع.Double إلعزخذا زا ا,Delegate الثذ ػ غخخ عذيذح رؾز ػ ٠ اع ا ذا خ ا ز ٠ شيذ رشي ب. ب زب ٠ : public int ReturnInt( double D) جسن الدالت // public boid amethod() mydelegate adelegate = new mydelegate(returnint); ك ٠ ثذايخ ا د ه ب ثا شبء دا خ اع ب ReturnInt ػ ب int رأخز ا ؼ بطش D ا ع.Duble ص ك ٠ دا خ أخش ه ب ث ؼ غخخ mydelegate اػي ب األع adelegate ص ؽذد ب adelegate ا ذا خ ٠ ReturnInt يو ثزشي ب. 9
ثؼذ زا, ثبه ٠ ب كوؾ ا و ثز شيش هي خ ٠ Delegate يو ثزشي ا ذا خ ث ب: adelegate(12345); انذ ال ان ج نت Methods( )Anonymous رأ ا د ا زب ي: private int[] numbers = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ; int[] EvenNumber = Array.FindAll(numbers, IsEven); private bool IsEven(int integer) Return (integer % 2 == 0); ك ٠ ا د ا غبثن ه ب ثزؼشيق array اع ب numbers خ ػششح ػ بطش ا ع.int ايؼب ه ب ثا شبء دا خ ا ع ( bool رؼ ٠ false أ )true اع ب IsEven رأخز ػ ظش اؽذ ا ع,true ص رو ثبخزجبس زا ا ؼ ظش ئرا ب ص ع ٠ ا كشد, ئرا ب ص ع ٠ رو ا ذا خ ثبسعبع ا وي خ int ئرا ب كشد رؼ د ثب وي خ.false ص عبء زا ا غش : int[] EvenNumber = Array.FindAll(numbers, IsEven); ك ٠ زا ا غش ه ب ثبعزذػبء دا خ اع ب ٠ FindAll ع دح ك ٠ ا لئخ,Array ر ي ا ذا خ رأخز ػ ظشي, األ ػجبسح ػ array ا ضب ٠ يغت أ ي ششؽ (,)Condition ا ششؽ ب ؼش ف ك ٠ بد ا جش غخ يز ا زؾون ئرا رؾون ا ششؽ ك ٠ ر ي ا ؾب خ ي True ئرا يزؾون ك ي.False ز ي ه ب ثا شبء ا ذا خ ٠ IsEven رزؾون ا ششؽ ئرا ب False أ.True ه ب ثاعزذػبئ ب ؼ ظش ػ بطش ا ذا خ.FindAll ع ف رو ا ذا خ FindAll ثوشائخ ا ظل كخ ا ز ٠ اػيذ ب, ػ ذ ػ ظش ع ف رو ثزجين ا ذا خ False ثز ي ا ؼ ظش, ئرا ب ذ ا زيغخ FindAll كغ ف رؼ د ا ذا خ True ػ ي, ئرا ب ذ ا زيغخ IsEven رؼ د ث. زا ؽز ٠ ر ز ٠ ػ بطش ا ظل كخ ب. ك ٠ ؽب ز ب ر ي ع ف رؼ د ا ذا خ FindAll ثز ي ا زيغخ: 2, 4, 6, 8, 10 ال ي ب ك ٠ ا ال ا غبثن ع ا شيوخ ا ز ٠ زج ب ث ب ا د. كوذ ه ب ثؼ دا خ ص اعزذػي ب ب ك ٠ ب أخش. ا ظش ا ٠ ا د ا زب ٠, لظ ا د ا غبثن غ ثؼغ ا زيشاد: private int[] numbers = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ; int[] EvenNumber = Array.FindAll(numbers, delegate(int integer 10
); Return (integer % 2 == 0); زا ا د يجذ أثغؾ ا د ا غبثن, سث ب ي أ ضش ك ب جؼغ. ك ٠ زا ا د غزذػ ٠ ا ذا خ IsEven ث ئ ب ؽز ٠ شأ ب. ا د ا ز ب هذ زج ب عبثوب ثذاخ ا ذا خ IseEven ه ب ث زبثز جبششح ؼ ظش ػ بطش ا ذا خ,FindAll غ ريش ثغيؾ ك ٠ ؿشيوخ ا زبثخ. ك ظش ا ي ػ هشة: delegate(int integer Return (integer % 2 == 0); ); وذ ه ب ث زبثخ خ Delegate ص زج ب ا ذا خ جبششح أ ب ػ ظش ثذاخ ر هيغ ا.Delegate هذ يجذ األ شؿيش ل جؼغ. رؼب ذ هج غ ا Delegates كغ ف ي األ ش ك ٠ ؿبيخ ا غ خ ذيي. أ ب ئ ر, كيغت ػ يي ؼشكخ ثؼغ ا ش ٠ ء ػ زا ا.Delegate بكؼ ب ريشاد ك ٠ ا د ب يغ ٠ ث,Anonymous Methods ا ا ذ ا ا غ خ. ر ي أل ب أخشع ب عغ ا ذا خ ا ش ا جيؼ ٠ ذ ا, ص ػؼ ب ك ٠ ب اعزذػبء ا ذا خ جبششح. ز ي يغت أ زج ا ٠ أ ر ي ا ذ ا ا غ خ ال ي ب اعزذػبئ ب ك ٠ ا ب أخش. ك وذ أطجؾذ أ ب هؼخ ا د يظ ب اع أ ر هيغ. yield ع خ yield رأخز ش ي, ئ ب yield return expression أ.yield break ششػ بري ا ش ي يغت أ أخز ثؼغ األ ض خ. ئرا ب ذي ب كئخ رؾز ػ ٠ غ ػخ ا ؼ بطش, ئرا ب شيذ ا ذخ ا ٠ ر ي ا ؼ بطش. كا بى ا ؼذيذ ا شم ا ز ٠ رإد ا ٠ ر ي. أثغؾ ؿشيوخ ٠ ػ Iterator )ا Iterator بئ يو ثب ذخ ا ٠ ا غ ػخ ا ؼ بطش (. ا ظش ا ضب ا زب ٠ : public class DayesOfWeek : IEnumerable String[] m_days = "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" ; public IEnumerator GetEnumerator() yield return m_days[0]; yield return m_days[2]; yield return m_days[4]; yield break; 11
Class TestDaysOfWeek Static void Main() DayesOfWeek week = new DayesOfWeek(); Foreach ( string day in week ) Console.Write(day+ " "); IEnumerator myenumerator = week.getenumerator(); While ( myenumerator.movenext() == true ) Console.Write(myEnumerator.Current + " " ); ك ٠ زا ا د ه ب ثا شبء كئخ رغ ٠ DaysOfWeek ا ز ٠ رو ثزجين ا interface ا ز ٠ رذػ ٠.IEnumerable ( يشع ٠ ا ؼ دح ا ٠ أ شعغ ل ا (. Interfaces ثزجين ر ي ا interface ػ ٠ ر ي ا لئخ, أطجؼ ذ ا لئخ دا خ رغ ٠.GetEnumerator() ئرا ب ثذاخ ر ي ا ذا خ خ yield كا ا زشع يؾذد ر ي ا ذا خ ػ ٠ ئ ب iterator يو ثز يذ كئخ عذيذح رو ثزجين ا interface ا ز ٠ رذػ ٠ MoveNext ب interface ايؼب يو ثز يذ ا ذ ا ا ز ٠ رؾز ي ب ر ي ا IEnumerator.Dispose ص ثؼذ ر ي ه ب ثؼ Loop ثبعزخذا ا.iterator ك ٠ شح يز كي ب ر ليز دا خ MoveNext ا ع دح ثذاخ ا iterator يز ر ليز ع خ yield اؽذح ص يز هق. ص ك ٠ ا ذ سح ا ضب يخ يز ر ليز ا غ خ ا ضب يخ ص يز هق زا ؽز ٠ يظ ا ٠ ع خ yield break ػ ذ ب يز هق بئيب. دػ ب ششػ ا د ششؽب أ ضش رلظيال : IEnumerator myenumerator = week.getenumerator(); ب ه ب ثبشزوبم ا بئ myenumerator ا لئخ ا ز ٠ يو ا زشع ثز يذ ب. myenumerator.movenext() ب يز ايغبد أ ع خ.yield ئرا عذ ا زشع ع خ yield break أ ا ز ٠ ا غب ا ز يذ س كي كغ ف رؼ د دا خ MoveNext ثب وي خ false ر ز ٠ ع خ.while ر ي ا غ خ رؾزلظ ثب وي خ ا ز ٠ رؼ د ث ب ع خ.yield أ ب زيغخ ر ليز زا ا جش ب ظ ك ٠ ب زب ٠ : myenumerator.current Sun Tue Thr 12
ييزاث C# 3.0 اإلطذاس #C 3.0 ؽشى خ #C ك ٠ ئرغب ا خ ا ظيليخ. ر ي ثزوذي أع ة أ ضش رظشيؾب. رغزخذ LINQ ع يغ ا يضاد ا غذيذح ك ٠ #C 3.0 روشيجب, ر ي ا يضاد رغؼ ب هبدسي ػ ٠ زبثخ د أ ضش ثغبؿخ ػ ػ. است تاج ان ع Inference( )Local Type ئعز زبط ا ع يؼزجش يضح سائؼخ ك ٠ أ خ. ك يغؼ ي ر زت ا د ث ز ٠ ا شاؽخ د رؾذيذ ع ا زيش ا ا بئ ا ز رزؼب غ. كب زشع ا خبص ثب خ يو ثبعز زبط ع ا زيش أ ا بئ, ر ي ثزؾ ي ا وي خ ا ع دح ك ٠ ا زيش أ ا بئ رؾذيذ ػ ب. روذ #C 3.0 يضح ئعز زبط ا ع ػ ؿشين زبثخ خ var ثذال زبثخ ع ا جيب. ا ظش ا ضب ا زب ٠ : int a = 5; var b = a; ه ب ثزؼشيق زيش ا ع int اػي ب ا وي خ 5, ص ػشك ب زيش غ ا ع اػي ب هي خ ا زيش a. ر وبئيب يو ا زشع ثزؾ ي ا جيب بد ا ع دح ك ٠ ا زيش a ص ظجؾ ع ا زيش ٠ B يز اكن ؼ ب, ثب زب ٠ ثؼذ ر ي ا ؼ يخ يزؾ ا زيش B ا ٠ ا ع.int ر ي ػ ؿشين اإلعز زبط. ا ظش ا د ا زب ٠ : int a = 5; int b = a; B غجوب, زا ا د بك ٠ ء د ا غبثن ر ب ب, ا زشع شيئب كب ع ؾذد ا ب. ا لشم ب ئ ب ؽذد ب ع ا زيش ز ي يغز زظ ثب غجخ جؼغ ا بط. رؼزجش يضح اعز زبط ا د اداح جش غي ا غب ٠. غ ر ي, اعز زبط ا د يؼزجش ا شيوخ ا ؽيذح ا ز ٠ ي ي ث ب رؼشيق زيشاد غ خ ا ع, ب ع ف ش الؽوب. خ var ي أ رغزخذ ثذاخ ا غب )Scope( ا ؾب ٠ كوؾ. ز ػيؼ ر ي ا ظش ا د ا زب ٠ : public void ValidUse( Decimal d) var x = 2.3 // double var y = x // double var r = x / y // double var s = "Sample" // string var I = s.length; // int var w = d; // decimal var p = default(string) // string 13
ك ٠ ا د ا غبثن ه ب ثزؼشيق زيشاد var داخ عغ ا ذا خ ي ػؼ ا ب ا ز ٠ ال يغ ؼ كي ب ثزؼشيق زيشاد.var ValidUse د أ ش خ, ا د ا زب ٠ class VarDemo var k =0; ال جيوز تعريف هتغري جمهول ىف جسن الفئت هببشرة // ال جيوز للع بصر املوجودة ىف توقيع الدالت أى تكوى جمهولت // public void InvalidUseParameter( var x) ال جيوز تعريف دالت جمهولت ال وع // public var InvalidUseResult() return 2; public void InvalidUseLocal() خطأ ىف ال حو ال يوجد عالهت = // ;x var ال ميكي است تبج وع املتغري هي القيوت var y = null // null K ر ي خال ا وي خ ا جذئيخ ك ٠ ا د ا غبثن, ا لزشع ئ ا زشع يغزيغ اعز زبط ع ا زيش InvalidUseResult ا زيش. زا ؿيش غ ػ ث ك ٠ زا ا ب ا د. ايؼب ا ذا خ اعز زبط ع ا زيغخ ا ز ٠ رؼ د ث ب, زا ؿيش غ ػ ث, كالثذ رؾذيذ ع ا ذ خ هج ا جش ظ. تؼبيراث ن ذا Expressions( )Lambda ب ر ش ب عبثوب ئ هؼخ ا د ػجبسح ػ رؾضي غ ػخ ا غ ا جش غيخ ث زف ر ليز ب غ ثؼغ ك ٠ هذ اؽذ ا ػذ ر ليز ب ػ ٠ اإلؿالم. ز ي ػ ذ ب ؾزبط ا ٠ زبثخ هؼخ ا د ثذاخ ا جش ب ظ ك و ثؼ دا خ رؾز ػ ٠ هؼخ ا د. ا د ا زب ٠ ػجبسح ثش ب ظ ثغيؾ, ه ب ثا شبء ؼي ك ٠ ا.List List رؾز ػ ٠ ػذح اع بء. ص أ شأ ب دا خ جؾش ػ أع class Program static void Main(string[] args) List<string> names = new List<string>(); names.add("dave"); names.add("john"); names.add("abe"); names.add("barney"); names.add("chuck"); string abe = names.find(isabe); 14
Console.WriteLine(abe); public static bool IsAbe(string name) return name.equals("abe"); ا د ا غبثن ػجبسح ػ دا زي, ا ذا خ ا ضب يخ اع ب IsAbe رؾز ػ ٠ عش اؽذ ا د ي ن ػ ي ايؼب هؼخ د رزؼب غ ػ ظش يذػ ٠ name ػ.string ك ٠ اإلطذاس ا ضب ٠ خ #C ر روذي ا ذ ا ا غ خ Methods( )Anonymous ا ز ٠ رؾذص ب ػ ب عبثوب. ٠ ليذح ك ٠ ؽب خ ئرا ب ذ هؼخ ا د رغزخذ ئال شح اؽذح, ز ي ي ب ا زؼذي ػ ٠ ا د ا غبثن يظجؼ ب زب ٠ : class Program static void Main(string[] args) List<string> names = new List<string>(); names.add("dave"); names.add("john"); names.add("abe"); names.add("barney"); names.add("chuck"); string abe = names.find(delegate(string name) return name.equals("abe"); ); Console.WriteLine(abe); وذ ه ب ثب بء ا ذا خ IsAbe بئيب زج ب ا د ا ز ب ثذاخ ب ك ٠ ا ب ا ز اعزذػي ب ب كي ك ٠ ا د األ. أ ا ب ثذال ػ دا خ ك ٠ ب ص اعزذػبئ ب ك ٠ ب أخش, ه ب ث زبثخ ا د جبششح د ػ ر ي ا ذا خ. ا ب Lambda Expressions كزو ثزغ ي ا ؼ يخ أ ضش ر ي: class Program static void Main(string[] args) List<string> names = new List<string>(); names.add("dave"); names.add("john"); names.add("abe"); names.add("barney"); names.add("chuck"); string abe = names.find((string name)=> name.equals("abe")); Console.WriteLine(abe); 15
: ك ٠ ا د ا غبثن, اعز ي ب ػ ا Delegate ه ب ث زبثخ رؼجيش ذا جبششح (string name)=> name.equals("abe") أل Lambda Expression ر يخ ث ب كي ا لبيخ إلعز زبط ع ا ؼ ظش, ز ي ي ب اإلعز بء ػ رؼشيق ع ا ؼ ظش ك ٠ ثذايخ ا زؼجيش: name => name.equals("abe") ي ي ا رغزجذ name ثبع اه زا, ك زا ا زؼجيش يغزخذ ئال شح اؽذح, ا ا ي رؾزبط ا ٠ اعزخذا زا ا ؼ ظش شح أخش. ز ي ي اعزخذا ؽشف اؽذ كوؾ ك ٠ :Lambda Expression n => n.equals("abe") رؼجيشاد ال ذا ر زت ػ ٠ زا ا ش دائ ب X => f(x) ؽيش X ي ض ا ؼ ظش, f(x) ر ض ا ذا خ أ ا ؼبد خ أ ا زؼجيش ا ز يغزخذ ا ؼ ظش X. انذ ال اإلضافيت Methods( )Extension ب اػؼ األع, كا ا ذ ا اإلػبكيخ رؼ ب زذاد بئ بد. ا ا ئرا ب ػ ذ ب كئخ رؾز ػ ٠ دا زي, أعز غخ ب ر ي ا لئخ بئ. ي ب ئػبكخ د ا زا ا بئ ػ ؿشين.Extension Methods ا ضب ا زب ٠ يو ثاػبكخ دا خ عذيذح رذػ ٠ IsVaildEmailAddress غخخ ا لئخ :String class Program static void Main(string[] args) string customeremailaddress = "test@test.com"; if (customeremailaddress.isvalidemailaddress()) // Do Something... public static class Extensions Public static bool IsValidEmailAddress(this string s) Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]2,4$"); return regex.ismatch(s); ػ ذ ب أخز غخخ ا لئخ String ك زا يؼ ٠ ئ ب ؼشف زيش ا ع string ب اػؼ ك ٠ ا د ا غبثن, ك زا ا غش يو ثزؼشيق string يذػ ٠.customerEmailAddress string customeremailaddress = "test@test.com"; 16
األ شيذ ئػبكخ دا خ لئخ String ر ي ا ذا خ رو ثب زؾون ئرا ب زا اإلي ي ز ة ثشيوخ طؾيؾخ ا ال. كو ب ث زبثخ ا ذا خ ا زب يخ: IsValidEmailAddress(this string s) Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]2,4$"); return regex.ismatch(s); ال ي ب ا ز زت ك ٠ عغ ا ذا خ, ا ز ي ب األ ا ؼ بطش ا ز ٠ ر عذ ك ٠ ر هيغ ا ذا خ. ب الؽظ أ this.string ب الؽظخ ايؼب أ بى خ s ا ع ا ذا خ رؾز ػ ٠ ػ ظش اؽذ this هج ا ؼ ظش األ ك ٠ ا دا خ, زا يؼ ٠ ئ ر ي دا خ ئػبكيخ (.string ث عذ خ رغجن خ Static ز ي.String يغت أ ر ا ذا خ اإلػبكيخ,)Extension Method ع ف رؼبف ا بئ ا ز ع ف رؼبف ا ي. public class Customer private int _id; public int Id get return _id; set _id = value; private string _name; public string Name get return _name; set _name = value; private string _city; public string City get return _city; set _city = value; public Customer() Object Initialization Expressions اكزشع أ ذي ب ا لئخ ا زب يخ: ئرا اسد ب ئشزوبم بئ ر ي ا لئخ ك ؾ و ث زبثخ ا شش ا زب ٠ : Customer c1 = new Customer(); 17
ك ٠ ر ي ا ؾب خ اطجؼ ذي ب بئ يغ ٠ C1 شزن ا لئخ.Customer ا خ ح ا زب يخ ٠ ئػبء هي خظبئض زا ا بئ. ر ي ا خظبئض ػؾخ ك ٠ ا د ا خبص ثب لئخ ثأػ ٠. ئػبء ا وي يز ب زب ٠ : c1.id = 1; c1.name = "Ahmed"; c1.city = "Cairo"; ر ي ٠ ا ؼ يخ ا ب خ إلشزوبم بئ رخظيض هي خظبئظخ. ثبعزخذا يضح Object Initialization ي ب رؾذيذ هي خظبئض ا بئ أص بء اشزوبه جبششح, ب زب ٠ : Customer c1 = new Customer Id = 1, Name = "Ahmed", City="Cairo" ; ي ب ػ غ ػخ بئ بد شح اؽذح رخضي ر ي ا بئ بد ك ٠ هبئ خ,)List( ب زب ٠ : List<Customer> listofcustomers = new List<Customer> Id = 1, Name = " Ahmed", City = "Cairo", Id = 2, Name = " Mohamed", City = "Alex", Id = 3, Name = "Mahmoud", City = "Tanta", ; األ اع ان ج نت Type( )Anonymous ا ظش ا ٠ ا د ا زب ٠ : var p1 = new Name = "DVD", Price = 3 ; ك ٠ زا ا د ه ب ثا شبء كئخ رؾز ػ ٠ خبطيزي,Price Name اػي ب خبطيخ هي خ. زا ا ال ب يؼزجش ػشثب ا خشاكبد عبثوب. األ ؽويو ٠ بئخ ثب بئخ. ك زا ا د ثب لؼ د ئ شبء كئخ. ب ثذ اع ثذ ا ي ا ؼزبد إل شبء ا لئبد. زا ا غذيذ ك ٠ ا ػ ع. كب زشع يو ثز يذ اع ز ا لئخ يو ثؼ ا ي ا ؼزبد ثذال ي. ال داػ ٠ أ أه ا ز ا لئخ ال ي اعز غبخ ب. ك ٠ رغزخذ ك ٠ ب ب كوؾ. Query Expression : زجذ اعزؼال SQL هج. ب يجذ ض زا اإلعزؼال var query = from c in customers where c.discount > 3 orderby c.discount select new c.name, Perc = c.discount / 100 ; أػزوذ ا شبث زا اإلعزؼال ا ز زجز ث.SQL خز ق. ك زا اعزؼال ث خ #C. ششػ زا اإلعزؼال يأر ٠ ك ٠ ا لظ ا زب ٠. ك زا اإلعزؼال اخزظبص,LINQ ا لظ ا زب ٠ ششػ كي.LINQ 18
انفصم انثا ى أساسياث LINQ زؼشف ك ٠ زا ا لظ ػ ٠ يليخ زبثخ رؼجيش اعزؼال ٠ ثبعزخذا.LINQ 19
يا ى LINQ ثبخزظبس شذيذ ثجغبؿخ أشذ, رؼزجش LINQ رو يخ ؽذيضخ ر ذف ا ٠ ر ؽيذ ؿشم األعزؼال ػ ا جيب بد ظبدس ب ا خز لخ... يجذ ا ا ا زؼشيق ي ثغيب ب ب ز هغ... ك جغؾ ا ػ ع ه يال. ب ٠ ر ي ا ظبدس ا خز لخ جيب بد ا ز ٠ يزؾذس ػ ب ا زؼشيق. أػزوذ ا ي رؼ ا بى ب يغ ٠ ثوبػذح ا جيب بد, ٠ ػجبسح ػ ق رخض كي ا جيب بد ثش ؼي ث ذف اعزشعبع ر ي ا جيب بد اداسر ب زا. رؼ ايؼب ا بى لبد رغ ٠,Spreadsheets ز ا لبد رو ثزخضي ا جيب بد ثش ؼي ثؾيش يغ اعشاء ػ ي ب ا ؼ يبد ا ؾغبثيخ أ اإلؽظبئيخ أ ايب ب ب. بى ايؼب ق ض,txt ا ز خض كي ا جيب بد ثش ؼي ث ذف هشائز ب كي ب ثؼذ أ اسعب ب ا ٠ ا ع خ أ ا عجت اخش. بى ا ؼذيذ أش ب رخضي ا جيب بد ا ع دح ك ٠ ػظش ب ا ؾب ٠...!... رؼ ا ٠ رؾظ ػ ٠ ا جيب بد ا ع دح ك ٠ ا ظذس ا ظبدس ا غبثوخ كأ ي ض ا رغزخذ ؿشيوخ خز لخ ظذس!. ؿجؼب ا ذ رؼ زا عيذا. ك ٠ ؾظ ػ ٠ ثيب بد خض خ ك ٠ ق spreadsheet ك ؾ غزخذ ثش ب ظ ض Excel أ math أ ا ثش ب ظ يذػ لبد.spreadsheets ٠ رؾظ ػ ٠ ثيب بد هبػذح ثيب بد كأ ذ رغزخذ ثش ب ظ اداسح ه اػذ ثيب بد ض SQL Server أ.Oracle زا رغذ ا ظذس ثيب بد ؿشيوخ إلعزخشاط ا جيب بد. ب رظ ش رو يخ LINQ ا,Language integrated Query روذ ؽال زبص ط ا ٠ ا جيب بد ا ظذس ايب ب.. رؼ ب ٠ ا Array. ؿجؼب رؼ ك ٠ بئ يز ر يذ ك ٠ ا زا شح يز رخضي كي غ ػخ ا جيب بد لظ ا ع. رؼ ئ ي ي اإلعزؼال ػ ا جيب بد ا ع دح ك ٠ ا array ثبعزخذا.LINQ ايؼب ي اإلعزؼال ػ ثيب بد ك ٠ ا د ا ز ر زج. ؽيش ي ي اإلعزؼال ػ د ا ؼي ه ذ ا ذ ث زبثز ب. ا ضيش ا ضيش... سث ب رغزيغ LINQ ي ب ب أ رغزؼ ػ ا جيب بد ا ع دح ك ٠ ا خ ا جشش. أ اع LINQ أ ب ػ أ اع LINQ ك ٠.LINQ to SQL LINQ to XML LINQ to Objects ثؼذ ر ي ا وذ بد ا غبثوخ ػ #C ػ,LINQ ذخ ك ٠ ط ت ا ػ ع ثؼذ... أػزوذ ا ا هذ ا بعت ٠ زؾذس ه يال ػ يليخ اعزخذا LINQ ا ؼ ث ب.!. ايبى أ ر ئ رل ب عجن ئال رل شيئب ب عيأر ٠. أ ي ي أ رغشة ث لغي, كبػزوذ ا ي غذ ا زي يأخز ثب ظيؾخ. 20
استؼالياث LINQ Query Syntax ٠ ل ا ؾ ا خبص ثبإلعزؼال ( Syntax,)Query يغت أ جذأ ث ضب ثغيؾ. ا د ا زب ٠ ػجبسح ػ كئخ اع ب Developer رؾز ػ ٠ صالس زيشاد :Age Name, Language public class Developer public string Name; public string Language; public int Age; رخي أ ي بى array ز ا لئخ ثذاخ ا زا شح. ا ا ػ بطش ا array ػجبسح ػ غ ػخ زا ا بئ.Developer رشيذ أ رغزؼ ػ ر ي ا بئ بد ا ع دح ثز ي ا.array ا ظش ا ٠ ا د ا زب ٠ : using System; using System.Linq; using System.Collections.Generic; class app start void Main() Developer[] developers = new Developer[] new Developer Name = " Ahmed", Language="C#", new Developer Name="Mohamed", Language="C#", new Developer Name="Taha", Languag="VB.NET" ; IEnumerable<string> developersusingcsharp = from d in developers where d.language =="C#" select d.name; froeach ( string s in developersusigncsharp ) Console.WriteLine(s); الؽظذ ع د Object.. Initialization ا ز ثخ ثخؾ ع يي )Bold(. ؼ ر ي األعش: ال ػ يي غشد عإا. ب ي ب ك ٠ زا ا د األعش from d in developers where d.language =="C#" select d.name; 21
,SQL زا اإلعزؼال. ا ش ٠ ء. أ ظشح يجذ أ خ اعزؼال غ ه ي ا زذهين رغذ ا خز ق ثؼغ هج أ يغت أ رؼ ب.Query Expression ئ اإلعزؼال ا غبثن عضء query.expression يظ بهض ث عضء. ك Query Expression يز أعضاء ػذيذح ي ب أخز ثؼؼ ب رشى ا جؼغ األخش. ر ي األعضاء رغ ٠ Operator.Operators يو ث ظيلخ ؾذدح. ك ب ش ك ٠ اإلعزؼال ا غبثن ا غضء ا خبص ث :Select select d.name; زا ا غضء خبص ثب Operator ا غ ٠.Select بى ايؼب ا غضء ا خبص ثب :from Operator ا ز يو ثبؽؼبس ا جيب بد ظذس ا جيب بد. from d in developers ؽيش يو زا ا Operator ثزؾذيذ ا بئ ا ز ع ف أخز ا جيب بد. يغت أ ػ ا ا بئ ا ز ع أخز ا جيب بد يغت أ يو ثزجين.IEnumerable<t> interface ا ب زا ا غضء اإلعزؼال : where d.language =="C#" ك ا Operator ا ز يؾذد ا شش ؽ ا اعت ر اكش ب ك ٠ ا جيب بد ا ز ٠ ع ف غزؼ ػ ب. ثؼ يخ ك زشح جيب بد ا ع دح ايغبد ا جيب بد راد ا اطلبد ا ؾذدح. ا ا يو اإلعزؼال ا غبثن ي ب زبثزخ ثشيوخ أخش رغ ٠ :Expression Tree IEnumerable<string> expr = developers.where (d => d.language == "C#" ).Select (d => d.name); Lambda Expression الؽظ أ Select Where ز ة ثؼذ.Lambda Expression رزشع ا ٠ غ ػخ.generic delegate ز ا 22
ذ اإلستؼالو انكايم Syntax( )Full Query ب رؼ دائ ب ر عذ شب ػ ذ رشع خ ا ظ ؾبد ا ؼ يخ, كب ؼ يزؾذس اإل غ يضيخ ز ي كب ظ ؾبد ك ٠ األعبط ثب خ اإل غ يضيخ. ػ ذ ؾب خ رشع خ ر ي ا ظ ؾبد ر زظ أع بء ؿشيجخ اؽيب ب رغجت اسرجبى ز و ٠ ا ؼ خ. ز ي, ظيؾخ... ا ز ثب ظ ؼ اإل غ يض كب ظ ؼ ا ؼشث ٠ ؿب جب ب ي ؿيش بعت. ا ب شخظيب ال اعزغيؾ رشع خ.Full Query Syntax ك ٠ ثب خ ا ؼشثيخ ر بد ر ؿيش ل خ. ا... دػي زا رؼب ٠ ش ب زا ا Syntax.Full Query اػزوذ ا ي الؽظذ ا ب زت خ From ك ٠ ا اإلعزؼال. اػزوذ ا ي رؼ ئ ئعزؼال SQL ز ت ك ٠ ا.Select برا عؼ ذ بي ش ع كذ خ From ك ٠ ا اإلعزؼال عؼ ذ خ Select ك ٠ أخش اإلعزؼال. زا ػ ع ي ششؽ. ث ب ا ب ي ا ضيش ا هذ ك زؾذس ػ ه يال. ع ؼذ ي ب ب ػ رو يخ رغ ٠ IntelliSense. اػؼ ا ي رغ غ... ؽغ ب... اعزخذ ذ ثش ب ظ Visual Studio هج. اػؼ ا ي اعزخذ ز. ع ي... ػ ذ زبثخ ا د ك ٠ زا ا جش ب ظ, ال ؾظذ ا ك ٠ ثؼغ األؽيب يو ا جش ب ظ ثاظ بس هبئ خ ثب ؼ بطش ا ؾز خ ا ز ٠ رغزيغ زبثز ب ك ٠ ر ي ا وخ ا د. ضال. ػ ذ زبثخ زا ا غش: Using System.Xml; ػ ذ زبثزي خ System ػغ ا وخ ا ز ٠ ثؼذ ب رغذ ا جش ب ظ يظ ش ي هبئ خ رؾز ػ ٠ ا ؼ بطش ا زلشػخ System ا ز ٠ رغزيغ زبثز ب ثؼذ خ.System ب ا ز أخجش Visual Studio ثز ي ا ؼ بطش ا ؾز خ, برا ٠ رخز ق رجؼب ؼ ظش ا ز زج. زا بيغ ٠.IntelliSense ػؾذ ا ظ سح األ. ؼ د ا ٠ اإلعزؼال برا From هج.Select ب ا ز زجخ ثؼذ خ From. اص بء اعزخذا ب SQL رؼ د ب ا زت اع ا غذ ا ز شيذ اؽؼبس ا جيب بد ثؼذ خ.From ك ٠ LINQ لظ األ ش ثب ؼجؾ, ؾ زت اع ا غذ أ ا بئ ا ز يؾز ػ ٠ ا جيب بد. ثؼذ خ Select و ثزؾذيذ ا ؼ بطش ا ز ٠ ع ف رغزشعغ زا ا غذ أ ا بئ. زج ب خ Select ك ٠ أ اإلعزؼال ثب غجخ LINQ ك يغزيغ Visual Studio ؼشكخ اع بء ا ؼ بطش ا ؾز خ أل ال يؼشف ا ظذس ثب ؼجؾ ع ف رأر ٠ ا جيب بد. ا ب زج ب خ Visual ظذس ا جيب بد أ ال. ثب زب ٠ يزؼشف Visual Studio ك ٠ ا اإلعزؼال كج زا خجش From Studio ػ ٠ ظذس ا جيب بد يؼشف ب ٠ ا ؼ بطش ا ؾز خ ا ز ٠ ي اعزشعبػ ب ثب زب ٠ يوذ ب هبئ خ ثز ي ا ؼ بطش خزبس ب ب شيذ... اػزوذ ا ي ك ذ األ برا From هج..Select ػب خ ئرا ب ا ػ ع طؼت ا ل كال ػ يي. ا زت From هج Select اػزجش أ ش ػغ ش. 23
ؼ د ا ٠ ا ػ ع األط ٠.Full query syntax اإلعزؼال ا ب ي ػ ٠ زا ا ش : from id in source from id in source / Join id in source on expr equals expr [into id] Let id = expr Where condition Orderby ordering, ordering,... [Ascending Descending] Select expr Group expr by key [into id query] انشرح from id in source ؽيش: :id اع ا ؼ ظش. ؽيش و ثزؾذيذ اع ؼ ظش ا ع د ك ٠ ا ظذس :source ا ظذس ضب ششػ: from p in Products ك ٠ ا غش ا غبثن ه ب ثزؾذيذ اع ؼ ظش اع p زا ا ؼ ظش يأر ٠ عذ.Products ؾ ظخ ثغيخ. ي ؼجبسح form ا رأر ٠ ثؼذ ب ػجبسح form اخش. ث ا ي ا يأر ٠ ثؼذ ب ػذح ػجبساد form يظ ػجبسح اؽذح. ي ايؼب ا يأر ٠ ثؼذ ب ػذح ػجبساد.join Select expr ؽيش expr ا ؾو أ ا ؾو ا ز ٠ ع ف غزشعؼ ب ا غذ, ي زت ك ٠ شexpression. 24
Group expr by key ؽيش key ا ؾو ا ز ع ف ؼ ث.group Let id = expr رغزخذ ؼ اعزؼال بد كشػيخ أ ب ي ن ػ ي ب.Sub-Queries Where condition ؽيش condition ا ششؽ أ غ ػخ ا شش ؽ. ثب جؾش ػ ثيب بد ب شش ؽ ؾذدح. ؽيش رو ػجبسح where ثؼ ك زش جيب بد ر ي Join id in source on expr equals expr ٠ رو ثزؾذيذ ش ا ؼالهخ ثي ا ي بد أ ا غذا. Orderby ordering, ordering,...[ascending Descending] ٠ رو ثزشريت ػشع ا جيب بد ئ ب ر بص يب أ رظبػذيب. ػ ٠ ؽغت هي خ ؽو أ ا ضش ؽو. into id query ػغ ا زيغخ ك ٠ ب إهذ إلعزؼال ب. ش ٠ ء ب شبث ؼ يخ اإلعزؼال بد ا لشػيخ. ب عجن ػجبسح ػ شعغ ع ف شعغ ا ي ػ ذ ا ؾبعخ ا ٠ زبثخ اعزؼال. ا ؼجبساد اص بء ا ششػ... ال رو ن ك ؾ جذأ ششػ ثؼذ. ع ف ل ش ٠ ء ػ ر ي 25
Query Operators ز ا شح أه ثزشع خ ؼ ٠,Operators أل رشع ز ب ا ؾشكيخ ع ف رغجت ثؼغ اإلسرجبى ك خ رؼ ٠ ا ش ا ا ؼب. ب شيذ ب ب.Operator ٠ Operator ي ب ششػ ا وظ د Operators ػ ػب ػ رشع ز ب. ك ٠ ػجبسح ػ د ا رأر ٠ عب ضح غ LINQ ر ي ا ذ ا يز رخظيظ ب ا ٠ ا اعزؼال رو ثا شبئ. ا ئ اإلعزؼال يظجؼ هبدس ػ ٠ اعزخذ ر ي ا ذ ا ك ٠ ػ يبر ا خبطخ. ا غذ ا زب ٠ ي ػؼ ع يغ ا Operators ا ز ٠ رأر ٠ غ.LINQ جذ ل :2.1 Operators LINQ Query Aggregate All Any Average Cast Concat Contains Count DefualtIfEmpty Distinct ElementAt ElementAtOrDefault Empty EquallAll Except First FirstOrDefault Fold GroupBy GroupJoin Intersect Join Last LastOrDefault LongCount Max Min OfType OrderBy OrderByDescending Range Repeat Reverse Select SelectMany Single SingleOrDefault Skip SkipWhile Sum Take TakeWhile ThenBy TheyByDescending ToArray ToDictionary ToList ToLookup ToSequence Union Where أساى هذ ه ذ ثؼذ األػ ذح عذر 4 ػذدد ا ظل ف عذر 13 ص ه ذ ثؼشة األػ ذح ك ٠ ا ظل ف عز 52 ص ه ذ ثشػ اؽذ ا برظ كأطجؼ 51... ذ عأخجشى ػ ٠ أ ؽب ا 51.Operator ا لبعأح ا ٠ عأششؽ. يب جذأ. 26
٠ Operators ػ بطش غ ػبد ا ا ب ػ بطش رؾز ػ ٠ غ ػخ ػ بطش. ا ؼ بطش ( )Elements ا ز ٠ ع ف رز ش ك ٠ ششػ ا )collections( ض ا ظل كبد أ ا List ا ب شبث. Aggregate ع ؼذ ػ ا غ غ ا ز شس. ضال ػ ذى األسهب األريخ )6 ),1,2,3,4,5 رشيذ ع ؼ ب ع غ ز شس. ثأ رغ غ أ ػ ظش غ صب ٠ ػ ظش ا برظ رغ ؼ غ صب ش ػ ظش ا برظ رغ ؼ غ ساثغ ػ ظش زا ؽز ٠ أخش ا ؼ بطش. يو Aggregate operator ثز ي ا ؼ يخ ع اء ب ذ ع غ أ ػشة أ ايب ب ب ذ. ا ظش ا ضب ا زب ٠ : int[] ints = 1, 2, 3, 4, 5, 6; لي أكتب اإلستعالم فسه فلي حنتبجه ىف الشرح // ;... from var query = int sum = ints.aggregate( (a,b) => a + b ); int product = ints.aggregate( 1, (a,b) => a * b ); int sump1 = ints.aggregate( 0, (a,b) => a + b, r => r + 1 ); ثؼذ ر ليز زا ا د رظجؼ هي خ ا زيش sum رغب 21 رظجؼ هي خ ا زيش product رغب 720 رظجؼ هي خ ا زيش sump1 رغب 22. ب زا ضب ثغيؾ. All ا ؼ بطش رؾون ششؽ ؼي. ز ٠ كبئذح.All Operator ك لزشع ا ي رشيذ ؼشكخ ا Doctors ذي سه برق. ا Doctors ا زي يغزشعؼ اإلعزؼال ذي سه برق. ؿجؼب ا زيغخ ر True أ.False Doctors doctors = new Doctors(); Var query = from doc in doctors...; bool allhavephone = doctors.all(doc => doc.phone > 0 ); bool thesehavephonr = query.all(doc => doc.phone > 0 ); Any يو زا ا operator ثلؾض ظذس ا جيب بد ا جؾش ػ ا ػ ظش يؾون ثؼغ ا شش ؽ ا ثخ. ك لزشع ا ي رشيذ ؼشكخ بى أ Doctor يؼيش ك ٠ ذي خ ا وب شح: ا زيغخ True أ.False Doctors doctors = new Doctors(); bool incairo = doctors.ant( doc => doc.city == "Cairo" ); 27
Average ز عؾ ا وي. غ ع ا وي ػ ٠ ػذد ب: int[] ints = 1, 2, 3, 4, 5, 6 ; decimal?[] values = 1, null, 2, null, 3, 4 ; Doctors doctors = new Doctors(); var query = from...; double avg1 = ints.average(); decimal? avg2 = values.average(); double avgyears = doctors.average( doc => DateTime.Now.Subtract(doc.StartDate).Days / 365.25 ); var avg = query.average(); ب بى ب يؾزبط ا ٠ ششػ... اػزوذ ا avgyears رؾزبط ا ٠ ثؼغ ا ز ػيؼ. ب و ث ؼشكخ ا هذ ا ؾب ٠ ص ؿشػ ربسيخ ثذأ ا ؼ ( ا زبسيخ ا ز ثذأ كي ا ذ ز س ا ؼ ) ص هغ خ ا برظ ػ ٠ 365.25 ػذد أيب ا غ خ ي ا برظ ضال 1.5 زا ؼ ب ا ا ذ ز س يؼ ز ػب ظق. ثب غجخ زيش avg1 هي ز رغب 3.5 غ ع هي ints وغ خ ػ ٠ ػذد ب. ا زيش avg2 ر هي ز 2.5 غ ع ا وي ا يش كبسؿخ ك ٠ values وغ خ ػ ٠ ػذد ب ٠ ب 4 هي. ا ب ا زيش avg كال يؼ هي ز ئال اهلل, ك ؾ ؾذد اعزؼال ؾذد ٠ يؾغت ب ز ع ;(. ArrayList al = new ArrayList(); al.add("abc"); al.add("def"); al.add("ghi"); var strings = al.cast<string>(); Cast يو يزؾ ي أ اع ا ؼ بطش ا ٠ ع ؾذد. ا د ا غبثن غ ػخ ا ؼ بطش ا ع ArrayList ر رؾ ي ب ا ٠ ا ع.string Concat يو ثشثؾ )Concatenate( ػ ظشي ثجؼغ كيظجؾب ػ ظش اؽذ. int[] ints1 = 1, 2, 3 ; int[] iints2 = 4, 5, 6 ; var query1 = from...; 28
var query2 = from...; object[] objects1 = "abc, "dfe" ; object[] objects2 = 1, 2, 3; var all = ints1.concat(ints2); var results = query1.concat(query2); var result = objects1.concat(objects2); ثؼذ ر ليز زا ا د رظجؼ هي خ ا زيش all رغب ( 6.) 1, 2, 3, 4, 5, أل Concat Operator هب ث ط ا ؼ ظشي ints2 ints1 ؼب كأطجؾب ػ ظش اؽذ. ا زيش result ال ؼ هي ز أل ب زت اعزؼال. ال داػ ٠ و زا ك ٠ شح. Contains يجؾش ثذاخ ا ؼ ظش يؾز ػ ٠ هي خ ؼي.ك لزشع ا ي رشيذ ؼشكخ بى Doctor اع Ahmed بصا يؼ ك ٠ ا غزشل ٠. ك ٠ ر ي ا ؾب خ و ثؼ غخخ ا بئ Doctor ؼي ب ا وي ا ز ٠ جؾش ػ ب, ش ئرا ب ا ؼ ظش يؾز ػ ي ب ا ال: Doctors doctors = new Doctors(); bool docexists = doctors.contain( new Doctor("Ahmed",... ) ); بى ؿشيوخ أخش, ٠ ا و ثؼ اإلعزؼال ص ا جؾش ثذاخ زيغخ اإلعزؼال : var query = from doc in doctors select doc.name bool docexists = query.contain("ahmed"); int[] ints = 1, 2, 3, 4, 5, 6 ; decimal?[] values = 1, null, 2, null, 3 ; IEnumerable<Doctor> doctors = new Doctors(); Var query = from...; Count يو ثؼذ ا ؼ بطش ا ز ٠ ثذاخ ا غ ػخ.)Collection( int count1 = ints.count(); int count2 = values.count(); int count3 = doctors.count; int count4 = doctors.count( doc => doc.city == "Cairo" ); int count = query.count(); زبئظ ر ليز ا د ٠ : 29
count1 = 6, count2 = 5, count3 = 12, count4 = 5 DefualtIfEmpty ئرا ب بى ػ ظش كبسؿب كيز ػغ هي خ اكزشاػيخ, ا خبطخ ث ع ثيب بد ا ؼ ظش: ئرا رؾذد ر ي ا وي خ كيز ػغ ا وي خ اإلكزشاػيخ int[] ints1 = 1, 2, 3, 4, 5, 6 ; int[] ints2 = ; var query = from...; var ints = ints1.defaultifempty(); var Zero = ints2. DefaultIfEmpty(); var minus1 = ints2. DefaultIfEmpty(-1); var result = query. DefaultIfEmpty(); ا زيش ints رظجؼ هي ز لظ هي خ ا زيش ints1 ر ي أل يظ كبسؿب. ا ب ا زيش Zero كزظجؼ هي ز 0 أل ا زيش ints2 كبسؿب ا ع int ا وي خ اإلكزشاػيخ ٠ int طلش. ا ؼ ظش minus1 رظجؼ هي ز 1- ر ي أل ا ؼ ظش ints2 كشاؽ ه ب ثزؾذيذ هي خ ئكزشاػيخ ئرا ب كبسؿب 1-. ٠ int[] ints = 1, 2, 2, 3, 2, 3, 4 ; var query = from...; var distinctints = ints.distinct(); var distinctresult = query.distinct(); Distinct يو ثاسعبع ا زبئظ ثذ ا ر شاساد: ثؼذ ر ليز ا د رظجؼ هي خ distinctints رغب ( 4,1(,2,3 ا ا ر ؽزف ا ؼ بطش ا ز شسح. ElementAt يو ثاسعبع ا وي خ ا ع دح ك ٠ سرجخ ؾذدح. ضال ا وي خ ا ضب يخ أ ا ضب ضخ: int[] ints = 1, 2, 3, 4, 5, 6 ; Doctors doctors = new Doctors(); var query = from ; int third = ints.elementat(2); Doctor doctor = doctors.elementat(2); var result = query.elementat(i); 30
ا ؼش ف ئ ا شرت ك ٠ #C رجذأ ا وي خ 0 ا ا ك ٠ ا ؼ ظش ints سه ( 1 ) يؼزجش ك ٠ ا شرجخ سه 0 سه ( 2 ) ك ٠ ا شرجخ سه اؽذ زا. ثز ليز زا ا د رظجؼ هي خ ا زيش third رغب 2. ElementAtOrDefault اسعبع ا وي خ ا ع دح ك ٠ سرجخ ؾذدح غ األخز ك ٠ اإلػزجبس ا هذ ي بى هي كبسؿخ. int[] ints = 1, 2, 3, 4, 5, 6 ; Doctors doctors = new Doctors(); var query = from ; int x1 = ints1.elementatordefault(2); int x2 = ints1.elementatordefault(6); int x3 = ints2.elementatordefault(0); Doctor doc1 = doctors.elementatordefault(2); Doctor doc2 = doctors.elementatordefault(-1); var result = query.elementat(i); هي خ ا زيش x1 رغب 3. هي خ ا زيش x2 رغب 0 ر ي أل ا ؼ ظش ints ال ي عذ ث سرجخ عبدعخ ك يؾز ػ ٠ عزخ ػ بطش كوؾ رجذأ ا شرجخ سه طلش ر ز ٠ ثب شرج سه خ غخ. Empty يو ثا زبط غ ػخ ػ بطش كبسؿخ: var emptydocs = System.Query.Sequence.Empty<Doctor>(); foreach( var doc in emptydocs) Console.WriteLine(doc); زا ا Operator ليذ ئرا ب ب بى ؽبعخ غ ػخ كبسؿخ ع ؼي. EqualAll يو زا ا ا ؼذد ا ال. Operator ث وبس خ غ ػزي ا ؼ بطش يزأ ذ ئرا ب ا يؾ ال لظ ا ؼ بطش لظ var query1 = from...; var query2 = from...; bool equal = query1.equalall(query2); 31
Except يو ث وبس خ غ ػزي ا ؼ بطش يغزشعغ ا وي ا ع دح ك ٠ ا غ ػخ األ ٠ ؿيش ع دح ك ٠ ا غ ػخ ا ضب يخ ثذ ر شاساد. int[] intss1 = 1, 2, 2, 3, 4, 5, 6 ; int[] intss2 = 1, 3, 6, 7 ; var diffints = intss1.except(intss2); رظجؼ هي خ ا زيش diffints رغب ( 5.)2, 4, First يو ثبعزشعبع أ هي خ ك ٠ غ ػخ ػ بطش, ثششؽ أ ر ر ي ا غ ػخ ؿيش كبسؿخ. int[] ints = 1, 2, 3, 4, 5, 6 ; Doctors doctors = new Doctors(); var query = from...; int first = ints.first(); Doctor doctor = doctors.first( doc => doc.city == "Cairo" ); var result = query.first(); ثز ليز ا د رظجؼ هي خ ا زيش first رغب 1. FirstOrDefault يو ثبعزشعبع أ هي خ ك ٠ غ ػخ ػ بطش. غ اؽز ب يخ ا ر ا غ ػخ كبسؿخ. int[] ints1 = 1, 2, 3, 4, 5, 6 ; int[] ints2 = ; Doctors doctors = new Doctors(); var query = from...; int x1 = ints.firstordefault(); int x2 = ints.firstordefault(); Doctor doctor = doctors.firstordefault ( doc => doc.city == "Cairo" ); var result = query.firstordefault (); ثز ليز ا د رظجؼ هي خ x1 رغب 1 هي خ x2 رغب 0, أل ا غ ػخ ints2 كبسؿخ. 32
Fold Aggregate يؼزجش زا ا Operator شبث Operator GroupBy ثو زا ا Operator ثزغ يغ ا ؼ بطش ا ع دح داخ غ ػخ كوب لزبػ ( )Key ػ اؽذ ا غضاء ا خ ؼ ظش لغ. ا لزبػ زا ػجبسح Doctors doctors = new Doctors(); var groups = doctors.groupby( doc => doc.city ); foreach ( var group in groups ) Console.WritLine(" 0: ", group.key ); Foreach ( var doc in group) Console.WriteLine(" 0", doc.name ); ا زيش groups يؾز ػ ٠ ا ؼ بطش ا ع دح داخ doctors شرجخ كوب لزبػ.City ا زيش group ػجبسح ػ ػ ظش اؽذ كوؾ داخ.groups ز ي ػ ذ زبثخ group.key كز ي ؼ ب هي خ ا لزبػ ا ز سرجذ ث اعزخ ا وي. var groups = doctors.groupby( doc => doc.city ); var groups = from doc in doctors group doc by doc.city into g delect g; var groups2 = doctors.groupby( doc => doc.city, doc => doc.name ); var groups2 = from doc in doctors group doc.name by doc.city into g select g; ضب أخش: GroupJoin سثؾ غ ػزي ثجؼؼ ب ػ ؿشين لبريؼ خزبسح ا غ ػزي. ص ػGroup جيب بد ثذاخ. DataSets.SchedulingDocs ds = FillDataSet(); var working = ds.doctors.groupjoin( ds.calls, doc => doc.initials, call => call.initials, (doc, call) => new doc.initials, calls = cal ); 33
foreach ( var record in working ) Console.WriteLine( "0: ", record.initials ); foreach ( var call in record.calls ) Console.WriteLine( " 0", call.daeofcall ); Intersect يو ثبعزشعبع ا ؼ بطش ا زشبث خ ك ٠ غ ػزي. غ ػز ب. ثششؽ أ ر ز ا ؼ بطش ؿيش ز شسح ك ٠ int[] intss1 = 1, 2, 2, 3, 2, 3, 4, 5, 6, 8 ; int[] intss2 = 6, 1, 3, 6, 7 ; var query1 = from...; var query2 = from...; var commonints = intss1.intersect(intss2); var commonresults = query1.intersect(query2); ك ٠ ر ي ا ؾب خ ي ب أ و ا هي خ ا زيش commonints رغب ( 6 (.,1,3 Join سثؾ غ ػزي ؼب خال لزبػ. ض ب ض ػجبسح inner join ك ٠.SQL DataSets.SchedulingDocs ds = FillDataSet(); var working = ds.doctors. Join( ds.calls, doc => doc.initials, call => call.initials, (doc, call) => new doc.initials, calls = cal ); Last يو ثبعزشعبع أخش ػ ظش ك ٠ ا غ ػخ. int[] ints = 1, 2, 3, 4, 5, 6 ; int last = ints.last(); هي خ ا زيش last رظجؼ... ( أ ) 34
int[] ints1 = 1, 2, 3, 4, 5, 6 ; int[] ints2 = ; int x1 = ints1.lastordefault(); int x2 = ints2.lastordefault(); LastOrDefault يو ثبعزشعبع أخش ػ ظش غ ػخ يؾز ا ي ث ب هي كبسؿخ. هي خ ا زيش x1 رغب 6. هي خ ا زيشx2 رغب 0. LongCount رو ثؼذ ػ بطش غ ػخ ؾذدح اعزشعبع ا برظ ك ٠ زيش ا عLong int[] ints = 1, 2, 3, 4, 5, 6 ; decimal?[] values = 1, null, 2, null, 3 ; long count1 = ints.longcount(); long count2 = values.longcount(); هي خ values رغب.5 هي خ count1 رغب 6. Max ايغبد أ جش هي خ ؼ ظش ك ٠ غ ػخ. int[] ints = 1, 2, 3, 6, 5, 4 ; decimal?[] values = 1, null, 4, null, 3, 2 ; var query = from...; int max1 = ints.max(); decimal? Max2 = values.max(); var max = query.max(); هي خ ا زيش max1 رغب 6. هي خ ا زيش max2 رغب 4. Min ئيغبد أطش هي خ ك ٠ غ ػخ. int[] ints 6, 2, 3, 1, 5, 4 ; 35
int min1 = ints.min(); OfType يو ثبعزخشاط ا ؼ بطش ا ع دح ك ٠ غ ػخ ثششؽ أ ر ع ؾذد. System.Collections.ArrayList al = new System.Colliction.ArrayList(); al.add(1); al.add("abc"); al.add(2); al.add("def"); al.add(3); var strings = al.oftype<string>(); ك ٠ ز ا ؾب خ رظجؼ هي خ strings رغب ( def (. abc, OrderBy رشريت ػ بطش ا غ ػخ رشريجب رظبػذيب كوب ألؽذ هي ا ؼ بطش. ئرا ب ذي ب غ ػخ رز ثيب بد أؿجبء. ب ذ ثيب بد األؿجبء رز سه ا جيت أع ػ ا برل..ا خ. ي ب ػشع ثيب بد األؿجبء شرج كوب أل هي خ ثيب بد األؿجبء ضال كوب شه ا جيت. Doctors doctors = new Doctors(); Var doc = doctors.orderby(doc => doc.id ); OrderByDescending يو ث لظ ػ ا Operator ا غبثن ز ا شح يشرت ا جيب بد رشريجب ر بص يب. Range يو ثز يذ ع غخ األسهب ا ظؾيؾخ ( )integers ؾظ سح ثي سه ي يز رؾذيذ. var onetoten = System.Query.Sequence.Range(1, 10); Repeat ر شاس هي خ ؼي خ ؼذد ؼي ا شاد. ا شه األ ا شه ا شاد ر شاس ا ضب ٠ ػذد ا ز شاساد 36
var zeros = System.Query.Sequence.Repeat(0, 8); Reverse يو ثؼ ظ رشريت ا ؼ بطش ا ع دح ك ٠ ا غ ػخ. int[] ints = 1, 2, 3, 4, 5, 6 ; var revints = ints.reverse(); رظجؼ زيغخ revints رغب ( 1 ) 6, 5, 4, 3, 2, Select ي ب زا ا Operator أخزيبس هي ثيب بد ؾذدح ػ ظش ك ٠ غ ػخ ػ بطش. ضال غ ػخ األؿجبء رؾز ػ ٠ ػ بطش ٠ األؿجبء ؿجيت يؾز ػ ٠ ػذح ثيب بد. ي ب اخزيبس ز ا جيب بد أ عضء ب. int[] ints = 1, 2, 3, 4, 5, 6 ; Doctors doctors = new Doctors(); var sameints = ints.select(x => x); var names = doctors.select( d=> new d. LastName, d. FirstName ); ك ٠ ا زيش sameintsه ب ثبخزيبس ا ؼ بطش ا ع دح ك ٠.ints ا ب ا زيش األع األ أع ا ؼبئ خ كوؾ ثيب بد األؿجبء. names ه ب ثأخزيبس SelectMany يو ثبعزشعبع ثيب بد غ ػخ ا غ ػبد. ضال ذي ب غ ػخ, ع ا ؼ بطش ث ب ػجبسح ػ array ك ٠ ر ي ا ؾب خ رغ ٠ غ ػخ ا غ ػبد أل ا array رؼزجش غ ػخ. تعريف جمووعت هي هصفوفبث // List<int[]> list = new List<int[]>(); int[] ints123 = 1, 2, 3 ; int[] ints456 = 4, 5, 6 ; إضبفت املصفوفبث اىل اجملووعت // List.Add(ints123); List.Add(ints456); var flat = List.SelectMany( x => x ); ا اعزؼ ب ػ ا ؼ بطش ك ٠ List ب ذ ا زيغخ ( int[] )int[], ا ظل كزي ا ع.int غ اعزخذا selectmany غ ا زيش,flat اطجؼ هي ز رغب ( 6.) 1, 2, 3, 4, 5, 37
Single يو ثبعزشعبع ػ ظش اؽذ كوؾ ا غ ػخ. ششؽ أ ر ا غ ػخ ث ب ػ ظش اؽذ كوؾ. int[] ints = 3 ; Doctors doctors = new Doctors(); Var query = from...; Int lone = ints.single(); Doctor doctor = doctors.single( doc => doc.initials == "mb1" ); Var result = query.single(); int pagernum = doctor.pagernumber; ثب غجخ زيش doctor غذ ا يؾ ػ ظش اؽذ كوؾ ا غ ػخ doctors ا ؼ ظش ا ز هي خ Initials كي رغب.mb1 زا ا زيش األ يؾ ا ؼ ظش ب ث ثيب بر. SingleOrDefault لظ ا Operator ا غبثن غ اؽز ب يخ أ ر ا غ ػخ كبسؿخ. int[] ints = 1, 2, 3, 4, 5, 6 ; var query = from...; var last3 = ints.skip(3); var bottom10 = query.skip( query.count() 10 ); Skip يو زا ا Operator ثزخ ٠ ػذ ؼي ا ؼ بطش ؽغت رشريج. ا زيغخ... last3 يغب ( 6,4(,5 ر ي أل رخ ٠ أ صالصخ ػ بطش. bottom10 ع ف يو ثؼذ ع يغ ا ؼ بطش يشػ 10 ثز ي ع ف يغزشعغ ع يغ ا ؼ بطش ػذ أخش ػششح. int[] ints = 1, 2, 3, 4, 5, 6 ; var Last3 = ints.skipwhile( x => x < 3 ) SkipWhile أ رخ ٠ ا ؼ ظش ا ؾب ٠ ئرا رؾون ششؽ ؼي. هي خ ا زيش Last3 رظجؼ ( 6.) 4, 5, 38
Sum يو ثغ غ هي غ ػخ ب. int[] ints = 1, 2, 3, 4, 5, 6 ; Doctors doctors = new Doctors(); int sum1 = ints.sum(); double sumyears = doctors.sum( doc => DateTime.Now.Subtract( doc.startdate).days / 365.25 ); Take 40 يو ثبعزشعبع يخ ػ بطش ؾذح اثزذاءا أ ػ ظش. ضال ئرا ب بى غ ػخ رؾز ػ ٠ 10 ػ بطش كوؾ غ ا ب ا جبه ٠. ئرا ب ا شه ا ؾذد ػ ظش ثبعزخذا Take ي ب ضال اعزشعبع أ 0 كب ا زيغخ ع ف ر 0 كا ا زيغ ع ف ر كبسؿخ. ئرا ب أ جش إلعزشعبػ أه ا غ ػخ ب خ. ي اعز زبط هي خ ا زيش.first int[] ints = 1, 2, 3, 4, 5, 6 ; var query = from...; var first = ints.take(3); var top10 = query.take(10); TakeWhile اعزشعغ ا ؼ بطش ا ز ٠ رؾون ششؽ ؾذد. رزز ش SkipWhile Operator وذ ب يزشى ا ؼ ظش ئرا ب رؾون ششؽ ؼي. ا ب TakeWhile ك ا ؼ ظ يأخز ا ؼ ظش ئرا ب رؾون ششؽ ؼي. ThenBy ا ظ زا ا د أ ال : Doctors doctors = New Doctors(); var docs = doctors.orderby(doc => doc.city).thenby(doc => doc.name ); ب رالؽظ يز اعزخذا GroupBy زشريت ا ؼ بطش كوب وي خ,City ص ثؼذ رشريت ا جيب بد يز رشريج ب شح اخش كوب ألع. ك لزشع ا ك ٠ ا زشريت األ ا زشريت ا وبئ خ ػ ٠ City ا ا ػششح ػ بطش 39
لظ هي خ,City يأر ٠ ThenBy ػ ٠ ز ا ؼ بطش ا ؼششح ص يؼيذ رشريج كوب.Name غ ػخ ػ بطش ب City زشبث خ. زا ك ٠ ThenByDesecnding لظ ا operator ا غبثن غ ا زشريت ر بص يب. ToArray يو ثبعزشعبع ا جيب بد رخضي ب ك ٠ بئ.array Doctors doctors = new Doctors(); var query = from doc in doctors where doc.city == "Cairo" select doc; Docotrs[] Cairo = query.toarray(); ToDictionary اعزشعبع ا جيب بد رخضي ب ك ٠ بئ يشج ا ظل كخ راد ا جؼذي array(.)two Dimension طق ك ٠ ز ا ظل كخ الثذ أ يؾ هي خ خز لخ ػ ثبه ٠ ا ظل ف. زا ا بئ يغV>٠.Dictionary<K, Doctors doctors = new Doctors(); var query = from doc in doctors where doc.city == "Cairo" select doc; Dictionary<string, Doctor> Cairo = query.todictionary( doc => doc.initials); ا بئ Dictionary يأخز هي زي ك ٠ طق, ا وي خ األ ٠ ر ض ا لزبػ ا ضب يخ ر ض ا وي خ ا زؼ وخ ثب لزبػ. ك ٠ ا د ا غبثن ا شب ب بئ dictionary ا وي خ األ ٠ doc.initials ٠ ا وي خ ا ضب يخ ٠ ػ ظش doctors ب. ي رؾذيذ ا ؼ ظش ا ضب ٠ ٠ يظجؼ ثيب اؽذ كوؾ يظ طق ثيب بد. كجذال أ يظجؼ ػ ظش doctors ث ب ثيب بر. ي ب اخزيبس ثيب اؽذ كوؾ. ToList اعزشعبع ا جيب بد رخضي ب ك ٠ بئ.List<T> List<Doctor> Cairo query.tolist(); 40
Dictionary<K, V> ToLookup اعزشعبع ا جيب بد رخضي ب ك ٠ بئ <V.Lookup<K, يظ ثب ؼش س أ ر ا وي ا خض خ هي لشدح. زا ا بئ يغج بئ ToSequence ششػ ؿشيوخ ػ زا ا Operator يغت أ ر ظش ا ٠ ا د ا زب ٠ أ ال : Doctors doctors = new Doctors(); int count = doctors.count( doc => doc.city == "Cairo" ); ك ٠ زا ا د اػؼ ئ ب شيذ ػذد ا جبء ا ز ي يؼيش ك ٠.Cairo زا ا د ع ف يزغجت ك ٠ خأ ػ ذ ر ليز ا د. ر ي أل ا غ ػخ doctors ب خبطيخ رغ ٠ count ايؼب ا operator ا خبص ثLinq يغ ٠ count ز ي ع ف يؾذس رؼبسع ثي ا خبطيخ ا.operator ي لز ا د, ز ي يظ ش ToSequence ؾ عشيغ ز ا ش خ. int count = doctors.tosequence().count( doc => doc.city == "Cairo" ); Union يو ثبعزشعبع ا جيب بد ا زشبث خ ك ٠ غ ػزي. ا ثظيخ أخش يو ثبعزشعبع ارؾبد كئزي. int[] ints1 = 1, 2, 2, 3, 2, 3, 4, 6 ; int[] ints2 = 6, 1, 3, 5 ; var allints = ints1.union(ints2); رظجؼ هي خ ا زيش allints رغب ( 5.)1, 2, 3, 4, 6, ص ا لئخ ا ضب يخ. ب الؽظ ا اعزشعغ ثيب بد ا لئخ األ ٠ ا ال Where اعزشعغ ا جيب بد ا ز ٠ رؾون ا ششؽ. int[] ints = 1, 2, 3, 4, 5, 6 ; var even = ints.where(x => x % 2 == 0); 41
انفصم انثانث LINQ To SQL زؼشف ك ٠ زا ا لظ ػ ٠ LINQ to SQL 42
LINQ to SQL أ أ عضء ك ٠ LINQ ا غضء ا خبص ثبإلعزؼال ا جيب بد ا ؼالئويخ أ ه اػذ ا جيب بد ا زؼبسف ػ ي ب. زا ا غضء ك ٠ LINQ يوذ ي ؿشين ع خ زؼب غ ا جيب بد ا خض خ ك ٠ ه اػذ ا جيب بد. ؽيش رو LINQ ثزؾ ي ب زجز د ا ٠ اعزؼال SQL رشع ا ٠ هبػذح ا جيب بد. ا ظش ا ضب ا زب ٠ : var query = from c in Customers where c.country == " USA" && c.state == "WA" Select new c.customerid, c.companyname, c.city ; زا ا د ع ف يزؾ ا ٠ اعزؼال SQL ث زا ا ش : SELECT CustomerID, CompanyName, City FROM Customers WHERE Country ='USA' AND Region = 'WA' ا ٠ زا ا ؾذ سث ب رشيذ أ رغأ ػذح اعئ خ. ا ال يق ي إلعزؼال LINQ ا ي زت ثبعزخذا اع ا بئ يز ا زؾون طؾز ث اعخ ا زشع ك ٠ ا بػ ٠ ب ا زؾون اإلعزؼال يز ػ ٠ يذ DBMS يظ زشع ا خ. صب يب ز ٠ يز ر يذ اعزؼال SQL اإلعزؼال ا ز زج ثبعزخذا LINQ. صب ضب ز ٠ يز ر ليز اعزؼال SQL. ؽغ ب ؽوي ػ ي ب أ و ثاعبثخ ر ي األعئ خ. ؼشكخ اإلعبثبد يغت ػ يي أ رل ب رط ا ي خ ( Model ) Entity ا خبص ث LINQ to SQL ز ي يغت أ رل ب اإلعزؼال ا إع ( Query.) Deferred انكي اث فى LINQ to SQL ا ثيب بد خبسعيخ ( ا خبسط بم ا د ) الثذ أ يز طل ب طلب رلظي يب ثذاخ ا د. يغت أ ي بى كئخ ( )Class أل عذ, ر ي ا لئخ الثذ أ ي ب Attributes رظق طق ا جيب بد ا ع د ثذاخ ا غذ. ا رظق ا ؾو ا ع دح ك ٠ ا غذ.ؿجؼب خال دساعزي خ #C رؼشػذ Attributes ب ٠ يق يز ا زؼب ؼ ب. ز ي زؾذس ػ ب ب. ا د ا زب ٠ ي ض رؼشيق ي خ: [Table (Name = "Customer")] public class Customer [Column] public string CustomerID; [Column] public string CompanyName; [Column] public string City; [Column(Name = "Region"] public string State; [Column] public string Country; ا Attributes ر ي ا ز ٠ ز ثخ ثي ا و عي ] ]. ث زا ا ش ر ي ا لئخ أطجؾذ رط غذ أ رط ي خ. 43
ؾغ ا ؾظ ا ي غذ ؼش زؼشيق رط ا ي خ ي خ رغزخذ ب. ال ؽز ٠ أل ي خ. كؼ ؿشين اعزخذا Visual Studio ي ي اػبكخ ق dbml اخزيبس هبػذح ا جيب بد ا غذا ا ز ٠ ع ف رزؼب ؼ ب يو Visual Studio ثز يذ ا د ا الص ثذال ي ب ػ يي كؼ خ إلعزخذا زا ا د ػ غخخ )Instance( ا ق اعزخذا ب ز ٠ : DataContext db = new DataContext(); ب رش كا اع ا ق ا ز ذ DataContext Visual Studio ك ٠ ا ؾويوخ ا ق اع Data كوؾ زا األع اخزيبسى ا ذ ا ب خ Context ك ٠ خ يؼيل ب.Visual Studio ك ٠ ز ا ؾب خ ثؼذ ػ غخخ ق dbml ي ب األ زبثخ اإلعزؼال ا بعت: var query = from c in db.customer where c.country == "USA" && c.state == "WA" Select new c.customerid, c.companyname, C.City ; foreach( var row in query ) Console.WriteLine( row );.)Anonymous Type زا ك ٠ ا جبديخ ه ب ثزؼشيق زيش ا ع var ا ا ؿيش ؾذد ا ع ( ا زيش يؼجش ػ زيغخ ر ليز ئعزؼال. زا اإلعزؼال رلظي ب زب ٠ : Customer ا ع د ك ٠ عذ c ػ ذ ب State = WA country = USA اخزبس.CustomerID, CompanyName, City ا زيش query األ اطجؼ يؾ ا زيغخ ا غزشعؼخ ر ليز زا اإلعزؼال. ص ثؼذ ر ي رو ع خ foreach ثب ذ سا ثذاخ ا زيش ا ؾب زيغخ اإلعزؼال رو ثؼشع عش ػ ٠ ا شبشخ. Stored Procedures اعزخذا Stored Procedure إلعزشعبع ا جيب بد يؼزجش األ س ا خ ك ٠ ػب ه اػذ ا جيب بد. ز ي ئرا ب ذيي هبػذح ثيب بد رؾ ر ٠ ػ ٠ Stored Procedures كي ي اعزذػبئ ث اعخ LINQ ث ز ٠ ا غ خ., يغت رؼشيق دا خ رؾز ػ ٠ طق Procedure ا ة ر ليز ؿجؼب ر ي ا ذا خ يغت أ ي ب ٠ Attributes ا ز ٠ رظق ا Procedure ب كؼ ب عبثوب غ ا غذا. اؽت أ 44
اه ي ال رو ن ك رو ثزؼشيق أ طق ا ش ٠ ء ث لغي. كزؼشيق ر ي ا ذا خ يز داخ ق dbml ايؼب. لظ ا ق ا ز اعزخذ ز زؼشيق ا غذا. ال ػشس ا ظش ا ٠ ش ا ذا خ: [SoredProcedure( Name = "dbo.[customer By City]")] public IEnumerable<CustomerInfo> CustomerByCity(String parm1) Return (IEnumerable<CustomerInfo>) this. ExecuteMethodCall<CustomerInfo>( this, ((MethodInf) (MethodInfo.GetCurrentMethod())), parm1); اػزوذ ا ا د ال يؾزبط ا ٠ ششػ... يظ جغبؿزخ ثب جغ ك ؼوذ ا ذسعخ األ ٠. أل ب زج. ك ٠ ر ي ا ؾب خ ثؼذ أ ر رؼشيق ا procedure ػ ٠ ا دا خ ثذاخ ا د ي ب اعزذػبؤ ب زب ٠ : var query = db.customerbycity("cairo"); Compiled Query اؽيب ب رؾزبط ا ٠ ئػبدح اعزخذا لظ اإلعزؼال غ هي خز لخ... ك ٠ ا ؾويوخ ؿب جب ب رؾزبط ا ٠ زا... ث ا ٠ ا بد أعض ا دائ ب ب رؾزبط ا ٠ زا. ز ي, رو ثؼغ ا DBMS ثؼ Optimization )رؾغي ( إلعزؼال ا غزوج ا رجين )Application( ر ي زؾغي األداء ػ يخ رشع خ )compilation( اإلعزؼال. ر ي يإد ا ٠ صيبدح أداء ا زجين ا ز اسع اإلعزؼال لغ, أل ا DBMS يؼيغ ا هذ ك ٠ أػبدح رؾ ي اإلعزؼال ك ٠ شح يز اسعب كي ب. روذ LINQ اعزشاريغيخ ؼ Optimization إلعزؼال, ك ٠ شح رو ثبسعب اإلعزؼال, يو ؾشى LINQ ثز يذ اعزؼال بعت ث خ SQL إلسعب ا ٠.DBMS ز ي روذ ي LINQ ؿشيوخ عيذح ؼ Optimization ر ي ػ ؿشين اعزخذا كئخ رغ ٠.CompiledQuery ثبعزخذا ر ي ا لئخ يؾزبط ا زشع ا ٠ رشع خ اإلعزؼال ك ٠ شح ر ج كي ب. ا ظش ا د ا زب ٠ : DataContext db = new DataContext(); Table<Customer> Customers = db.gettable<customer>(); var query = CompiledQuery.Compile( ( DataContext context, string filtercountry ) => from c in Customers where c.country == filtercountry select new c.customerid, c.companyname, c.city ); foreach ( var row in query(db, "USA")) Console.WriteLine( row ); Foreach ( var row in query(db, "Italy")) Console.WriteLine( row ); 45
ب رش, اعزخذ ب دا خ CompiledQuery.Compile() زج ب اإلعزؼال أ ػ ظش كي ب. ا ب اإلعزؼال لغ كوؾ زت ػ ٠ ش.Lambda Expression ه ب ثبعزذػبء اإلعزؼال شري شح ثوي خ خز لخ ػ األخش. ب الؽظ أ زيغخ ر ليز اإلعزؼال ع ف رخض ك ٠ بئ.var ؽغ ب, برا اسدد ي ب ب أ رخض زيغخ اإلعزؼال ك ٠ بئ static غ خ ئػبدح اإلعزخذا... اػزوذ ا ك ٠ ر ي ا ؾب خ يغت ػ يي ا ر ظش ا ٠ ا د ا زب ٠ : public static Func<nwind.Northwinf, string, IQueryable<nwind.Customer>> CustomerByCountry = CompiledQuery.Compile( ( nwind.northwind db, string filtercountry ) => from c in db.customers where c.country == filtercountry select c ); static void CompiledQueriesStatic() nwind.northwind db = new nwind.northwind( ConnectionString); foreach ( var row in CustomerByCountry( db, "USA" )) Console.WriteLine(row.CustomerID); foreach ( var row in CustomerByCountry( db, "USA" )) Console.WriteLine(row.CustomerID); ثؼذ سؤيخ زا ا د أػزوذ ا ي رل ش ك ٠ ػذ اعزخذا زا ا ز يغ ٠ Compiled Query ال داػ ٠ ؼ ا Optimization أل ش ٠ ء. ك ٠ ا ؾويوخ ا د يظ ثظؼ ثخ ش. ئ ك ذ ا د عيذا ك رغذ ا طؼ ثخ ك ٠ ػ ث ثب ؼ ظ هذ ال رغزخذ ك ٠ ثشا غي ع.Compiled Query ا ة ي كوؾ ؼشكخ خ #C ا زؾغي بد ا غذيذح ا ز ٠ ؿشأد ػ ي ب. بى ا ؼذيذ ا زت ا ز ٠ رزؾذس ػ ب. طرق يختهفت نإلستؼالو ػ انبيا اث اإلعزؼال ا زب ٠ ز ة ث خ SQL يو ثؾغبة غ ػخ يخ زظ ر ثيؼ. ؽذح زظ ؼي ر ثيؼ ب. ا زظ ك ٠ زا اإلعزؼال اع.Chocolade ا اعزؼال ؼشكخ SELECT SUM( od.quantity ) AS TotalQuantity FROM [Prosucts] p Left Join [Order Details] od ON od.[productid] = p.[productid] WHERE p.productname = 'Chocolade' Group By p.productname زج ب ر ي اإلعزؼال ثبعزخذا LINQ كغ ف يجذ ب زب ٠ : 46
var queryjoin = from p in db.products join o in db.order_details on p.productid equals o.productid into OrdersProduct where p.productname == "Chocolade" select OrdersProduct.Sum( o => o.quantity ); var quantityjoin = queryjoin.single(); Console.WriteLine( quantityjoin ); ب الؽظ ا ب اعزخذ ب Join زؾذيذ ا ؼالهخ ثي ا غذ ي رؾذيذا طشيؾب ال يش ث ا خأ. LINQ ث زبثخ اعزؼال د رؾذيذ طشيؼ ؼالهخ ا ز ٠ ثي ا غذ ي. ب زب ٠ : رغ ؼ ب var queryassociation = from p in db.products where p.productname == "Chocolade" select p.order_details.sum(o => o.quantity); var quantityassociation = queryassociation.single(); Console.WriteLine( quantityassociation ); ػ ذ ب رو LINQ ثزؾ ي اإلعزؼال ي ا غبثوي ا ٠ د SQL ك ٠ ر زظ لظ ا د ك ٠ ا ؾب زي. ا لشم ثي ب أ ا د األ ا ز ر رؾذيذ ا ؼالهخ كي رؾذيذا طشيؾب أ ضش ك ب ا د ا ضب ٠ أؿ اؽز ب يخ ا خأ ك ٠ زبثخ ا ؼالهخ ع دح. ك ٠ ا ؾب زي ر LINQ ا ؿشيوخ رغزخذ. ث ا ذ ا ز هذ ي ز ثأ ؿشين ع ف ر زت ا د ا خبص ثي... األ ش يؼ د ا يي. بى ش ٠ ء أخش هذ رؾت ؼشكز. ثب غجخ إلعزؼال ا غبثن, يظ بى داػ ٠ زبثخ اعزؼال ب, ب رشيذ زا اإلعزؼال هي خ اؽذح كوؾ ٠ يخ ا زظ ا ز ٠ ثيؼذ. ي ي زبثخ ا د ا زب ٠ ثبعزخذا ثؼغ ا operators ا غبثن ششؽ ب ي ي ؼب غخ األ ش ثشيوخ عشيؼخ: var chocolade = db.products.single( p =>.ProductName = "Chocolade" ); var quantityvalue = chocolade.order_details.sum( o => o.quantity ); Console.WriteLine( quantityvalue ); ا خ ح األ ٠ ك ٠ ا د ا غبثن رو ثزؾذيذ ا ي خ ا ز ٠ زؼب ؼ ب. ا خ ح ا ضب يخ رو ثب ذخ ا ٠ عذ Order_Details ؾغبة ا يخ. ا ظشح األ ٠ يزشائ ٠ ي أ زا ا د أهظش ك ٠ زبثز وبس خ ثبإلعزؼال ا ب, ألعق أدائ اع ء اداء اإلعزؼال... هذ ي زا ا د طؾيؼ بعت ئرا ذ رشيذ ئعشاء ػ يخ اؽذح كوؾ غ ئ ب ثبه ٠ ا ظش ف. هذ ي ؿيش بعت ك ٠ اإلعزخذا ا ؼب. رؼ ي LINQ رخضي غخخ ا ي خ ا ز ٠ رزؼب ؼ ب ك ٠ ا زا شح. ئرا اسدد اعشاء ا اعزؼال اخش أ هي خ أخش لظ اإلعزؼال ػ ٠ لظ ا ي خ ك ٠ ع دح ك ٠ ا زا شح ثب لؼ. ا د ا غبثن ا خزظش يو ثؼ غخ خ ا ي خ ك ٠ ا زا شح أل اعزشعغ ثيب اؽذ كوؾ. ز ا وخ, ا زا ا د هب ثؼ غخخ ا ي خ داخ ا زا شح كا اداء اإلعزؼال ع ف ي ك ٠ ز ٠ ا غ ء أل ث ز ٠ ا جغبؿخ هب ثؼ غخخ ي خ ػالهخ ثي ب ثي عذ أخش كوؾ يؾغت شح اؽذح كوؾ يخ ا زظ Chocolade ا ز ر ثيؼ. 47
هذ رؼزوذ ئ ب ه ب ثؼ ئعزؼال ي ػ ذ ب دخ ب ػ ٠ ا جيب بد ثبعزخذا ا ي خ Product أل ب اعزخذ ب ع خ زخظيض ا زيش choclade ع خ أخش ؾغبة ا يخ. زا اإلكزشاع ؿيش طؾيؼ ر ب ب. ؽز ٠ زج ب ع خ اؽذح كوؾ, كا اعزخذا ا ي خ Product ع ف ي زظ لظ ا زيغخ ( ا خبطخ ثب بئ بد ا ز ٠ ك ٠ ا زا شح ؼب غخ (. SQL var quantitychocolade = db.products.single( p => p.productname == "Change" ).Order_Details.Sum( o => o.quantity ); Console.WriteLine( quantitychocolate ); يجذ أثغؾ... ا د ا غبثن ثب شؿ ا ع خ اؽذح ئال ا زيغخ ر ليز ( ا خبطخ ثبألداء يظ ثب ؼبئذ ) زشبث خ ا د ا ز هج. ك ٠ ا ؾويوخ ئيغبد ؿشيوخ بعجخ ذخ ا ٠ ا جيب بد رؼز ذ ػ ٠ ع يغ ا ؼ يبد اإلعزؼال بد ا ز ٠ يو ث ب ا جش ب ظ. كب ط ا ٠ ا جيب بد ػ ؿشين ا ذخ ا ٠ ا ي بد سث ب يوذ أداء أكؼ. ك ٠ ا غب ت األخش ئرا ذ رؾظ ػ ٠ زيغخ اإلعزؼال ثبعزخذا أ اع غ خ types( )Anonymous ال رو ثب ؼ ػ ٠ ا ي بد ك ٠ ا زا شح, كشث ب رلؼ أ رؼ ثشم رؼز ذ ػ ٠ اإلعزؼال بد... ث بءا ػ ٠ ر ي ا ؾبالد ا غبثوخ ي ب أ و ئ ا شيوخ األ ض ذخ ا ٠ ا جيب بد " يؼز ذ ػ ٠ ". اإلستؼالياث ان باشرة Queries( )Direct ك ٠ ثؼغ األؽيب هذ رؾزبط ا ٠ اعزخذا ثؼغ يضاد SQL ا يش ع دح ك ٠.LINQ ػ ٠ عجي ا ضب وذ رؾزبط ا ٠ اعزخذا يضح (CTE) Common Table Expressions أ اعزخذا أ ش.PIVOT ال ر ي ExecuteQuet<T> ث يخ اػؾخ ز ا يضاد. ا ضب ا زب ٠ ي ػؼ ي ي ليخ اعزخذا دا خ LINQ إلسعب اعزؼال جبشش وبػذح ا جيب بد. ثخظ ص ؽشف T ا ع د ك ٠ ExecuteQuery<T> ك ي ض ا ي خ ا ز ٠ ع ف غزخشط ب ا جيب بد. ثخظ ص ا د ا زب ٠, يظ ة ي ؼشكخ برا يلؼ, ث ب ة أ رؼ أ ي ي ي زبثخ اعزؼال SQL جبششح ثذاخ.LINQ var query = db.executequery<employeeinfo>(@" With EmployeeHierarchy (EmployeeID, LastName, FirstName, ReportsTo, HierachyLevel) AS ( SELECT EmployeeID, LastName, ForstName, ReportsTo, 1 as HierarchyLevel FROM Employees WHERE ReportsTo IS NULL UNION ALL SELECT e.employeeid, e.lastname, e.firstname, e.reportsto, eh.hierarchylevel + 1 AS HierarchyLevel FROM Emplyees e INNER JOIN EmployeeHierarchy eh ON e.reportsto = eh.emplyeeid ) SELECT * FROM EmployeeHierarchy ORDER BY HierarvhyLevel, LastName, FirstName" ); 48