You are on page 1of 53

‫إبذأ‬

‫‪LINQ‬‬
‫كيفيت انؼًم بانتمُيت انجذيذة نإلستؼالياث باستخذاو نغت ‪C#‬‬

‫‪Linverno‬‬
‫‪2008‬‬

‫‪1‬‬
‫بسى اهلل انردًٍ انرديى‬

        

       

           

     

‫صذق اهلل انؼظيى‬


‫ثخ‬ٞ‫سح اُز‬ٞ‫ع‬

2
‫يمذيت‬

‫‪ٛ‬زا اٌُزبة عضء ٖٓ ٓغ‪ٜٞ‬د ُخذٓخ اإلعالّ ‪ٝ‬أُغِٔيٖ‪ُ .‬زُي ك‪ٓ ٜٞ‬غبٗ‪ ,٠‬ي٘زلغ ث‪ ٖٓ ٚ‬أساد اإلٗزلبع‪ٝ .‬ؿيش‬
‫ٓؾذد أ‪ٓ ٝ‬وظ‪ٞ‬س ػِ‪ ٠‬كئخ خبطخ‪ .‬ئٌ٘ي ايؼبً ٗغخ‪ ٝ ٚ‬ر‪ٞ‬صيؼ‪ ٝ ٚ‬ؿجؼ‪ٝ ٚ‬اإلهزجبط ٓ٘‪ ٚ‬ثأ‪ ٟ‬ط‪ٞ‬سح ًبٗذ‪.‬‬
‫ثَ ٖٓ األكؼَ إٔ يزْ ر‪ٞ‬صيؼ‪ٗ ٝ ٚ‬شش‪ ٙ‬هذس اإلعزـبػ‪ٝ .ٚ‬ارٔ٘‪ ٖٓ ٌَُ ٠‬يغزـيغ إٔ يوذّ ًزت ػِٔيخ ٗبكؼخ إٔ‬
‫ال يزأخش ػٖ ‪ٛ‬زا‪ .‬كخيشًْ ‪ًٔ -‬ب رؼِٔ‪ ٖٓ – ٕٞ‬رؼِْ اُؼِْ ‪ ٝ‬ػِٔ‪.ٚ‬‬

‫‪ٛ‬زا اٌُزبة ُيظ ُِٔجزذأيٖ ك‪ ٠‬اُجشٓغخ‪ .‬الثذ ٖٓ دساعخ اُجشٓغخ اُشيئيخ أ‪ٝ‬الً صْ دساعخ ‪ٝ DotNet‬ثؼغ ٖٓ‬
‫‪ٝ SQL‬أعبعيبد ه‪ٞ‬اػذ اُجيبٗبد‪ٓ ٝ ,‬ؼشكخ اُوِيَ ػٖ ‪ ٝ .XML‬األهَ ػٖ ‪ .ADO.NET‬ؽز‪ ٠‬رزٌٖٔ ٖٓ‬
‫اعزيؼبة ‪ٛ‬زا اٌُزبة اعزيؼبة عيذ‪ .‬ك‪ ٜٞ‬يوذّ رو٘يخ عذيذح ك‪ ٠‬اإلعزؼالّ ػٖ اُجيبٗبد ٖٓ ٓظبدس اُجيبٗبد‬
‫أُخزِلخ‪ٝ .‬يوذّ ششػ ُٔلب‪ٛ‬يْ ‪ ٝ‬اعزخذاّ ُٔٔيضاد ُـبد اُذ‪ٝ‬د ٗذ اُؾذيش ( ‪)C# 3.0‬‬

‫‪ٛ‬زا اٌُزبة يؾز‪ ٟٞ‬ػِ‪ 50 ٠‬طلؾخ روشيجبً‪ُ .‬وذ ساػي٘ب أال يٌ‪٘ٛ ٕٞ‬بى أ‪ ٟ‬صيبداد ك‪ ٠‬اُششػ رإد‪ ٟ‬اُ‪ ٠‬كوذ‬
‫اُزشًيض أ‪ ٝ‬اإلثزؼبد ػٖ ٓ‪ٞ‬ػ‪ٞ‬ع اٌُزبة‪ُ .‬زُي عبء اٌُزبة ٓشًض ‪ ٝ‬شج‪ ٚ‬شبَٓ ألعبعيبد اُزو٘يخ‪٘ٛ .‬بى اُؼذيذ‬
‫ٖٓ اٌُزت اُز‪ ٠‬رضيذ طلؾبر‪ٜ‬ب ػٖ ‪ 500‬طلؾخ‪ ٌُٖ .‬ك‪ ٠‬اُؾويوخ ئٌٖ ئخزظبس‪ٛ‬ب اُ‪ ٠‬سثغ ‪ٛ‬زا اُؼذد‪ُ .‬زُي‬
‫اثزؼذٗب ػٖ ًَ ٓب ُيظ ُ‪ ٚ‬داػ‪ٝ ٠‬هذٓ٘ب ػِٔبً خبُظبً ثذ‪ ٕٝ‬رؼويذاد‪ .‬ع‪ٞ‬ف رغذ إ ‪ٛ‬زا اٌُزبة يزؾذس ػٖ‬
‫اُغذيذ ك‪ LINQ To SQL ٝ C# ٠‬كوؾ‪ .‬ك‪ ٠‬أُغزوجَ اُوشيت عذاً – ئٕ شبء اهلل – ع‪ٞ‬ف ٗوذّ ًزبة أخش‬
‫يزؾذس ػٖ ‪.LINQ To XML‬‬

‫ٗشع‪ ٖٓ ٞ‬اهلل إٔ يٌ‪ٛ ٕٞ‬زا اٌُزبة ٗلؼبً ُ٘ب ك‪ ٠‬اُذٗيب ‪ ٝ‬األخشح‪ٗٝ .‬لؼبً ُغٔيغ أُغِٔيٖ‪.‬‬

‫‪3‬‬
‫انًذتٕياث‬
‫انفصم األٔل‬
‫ييزاث نغت ‪C#‬‬

‫انفصم انثاَى‬
‫اساسياث ‪LINQ‬‬

‫انفصم انثانث‬
‫‪LINQ To SQL‬‬

‫‪4‬‬
‫انفصم األٔل‬
‫ييزاث نغت ‪C#‬‬
‫‪ ٝ ,C#3.0‬ايؼبً‬ ‫يوذّ ‪ٛ‬ز‪ ٙ‬اُلظَ أُيضاد اُغذيذح ك‪ُ ٠‬ـخ‬
‫ثؼغ أُيضاد ك‪.C# 1.0 ٝ C# 2.0 ٠‬‬

‫‪5‬‬
‫أُؼشكخ اٌُبِٓخ ثبُزؾغي٘بد اُز‪ ٠‬ادخِذ ػِ‪ُ ٠‬ـخ ‪ C#‬ك‪ ٠‬اإلطذاس اُضبُش ُ‪ٜ‬ب ُيغذ ػش‪ٝ‬سيخ إلعزخذاّ‬
‫‪ٓ .LINQ‬غ رُي‪ ,‬ع‪ٞ‬ف ٗوذّ ‪ٝ‬طق هظيش ُٔيضاد ‪( C#‬اثزذاءاً ٖٓ ‪ C# 1.x‬ؽز‪ٝ )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 ٠ٔ‫زا يغ‬ٛ ٙ‫كؼِ٘ب‬
ًَ ‫ صْ اعزذػي٘ب‬.int, double, char ‫اع ٓخزِلخ‬ٞٗ‫) ٖٓ صالصخ ا‬array ( ‫كبد‬ٞ‫اُغبثن هٔ٘ب ثؼَٔ صالصخ ٓظل‬
.‫ ٓؼزبد‬ٝ ٠‫زا ؿجيؼ‬ٛ ًَ .‫ب‬ُٜ ‫ع أُ٘بعت‬ُٞ٘‫ب ا‬ٜ‫داُخ ٓغ اػـبئ‬

‫ٕ اُؾبعخ‬ٝ‫ د‬, ‫ اٗ٘ب ٗغزـيغ ػَٔ ٗلظ اُجشٗبٓظ اُغبثن ٔرنك بذانت ٔادذة فمط‬ٞٛ 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‬‬
‫كِ٘لزشع إ ‪٘ٛ‬بى داُخ ك‪ًٞ ٠‬د يزْ ًزبثز‪ ,ٚ‬رِي اُذاُخ ع‪ٞ‬ف رغزذػ‪ ٠‬ك‪ٌٓ ٠‬بٕ ٓؾذد ك‪ ٠‬اٌُ‪ٞ‬د‪ٝ .‬اُذ‪ٝ‬اٍ‬
‫رغزذػ‪ ٠‬ثإٔ يٌزت اعٔ‪ٜ‬ب ك‪ ٠‬أٌُبٕ اُز‪ٗ ٟ‬شيذ‪ .ٙ‬صْ ثؼذ رُي ٗو‪ ّٞ‬ثزشـيَ اٌُ‪ٞ‬د أ‪ ٝ‬رشعٔز‪ ٖٓ ٚ‬هجَ أُزشعْ‪,‬‬
‫‪ٓ ًَٝ‬شح يزْ رشـيَ كي‪ٜ‬ب اٌُ‪ٞ‬د يزْ اعزذػبء اُذاُخ ػ٘ذ ٗلظ اُ٘وـخ أ‪ ٝ‬أٌُبٕ اُز‪ً ٟ‬زج٘ب اعٔ‪ٜ‬ب كي‪ٓ ٌُٖ .ٚ‬برا‬
‫ُ‪ ٞ‬ؽذس ‪ً ٝ‬بٕ ػ٘ذٗب ػذح د‪ٝ‬اٍ ‪ٗ ٝ‬شيذ إٔ ٗغزذػ‪ ٠‬داُخ ‪ٝ‬اؽذح كوؾ ‪ٝ‬كوبً ُؾذس ٓؼيٖ‪٘ٛ .‬بى اُؼذيذ ٖٓ‬
‫‪ ,IF‬أ‪ ٝ‬عِٔخ ‪٘ٛ ٌُٖ .Switch‬بى ؽَ أكؼَ ‪ ٞٛ ٝ‬اعزخذاّ‬ ‫اُـشم‪ ,‬كٖٔ أٌُٖٔ إ ٗغزخذّ عِٔخ‬
‫‪.Delegate‬‬

‫‪8‬‬
‫يؼزجش اُـ ‪ ٞٛ Delegate‬اُـشين اُز‪ ٟ‬رؼَٔ ث‪ ٚ‬األؽذاس‪ .‬اُـ ‪ Delegate‬يؼزجش ٓإشش ُِذ‪ٝ‬اٍ ( ‪.)Pointer‬‬
‫ك‪ ٜٞ‬يو‪ ّٞ‬ثزٔشيش أُشعغ اُخبص ثبُذ‪ٌٓ ( ٍٝ‬بٕ اُذاُخ ك‪ ٠‬اُزاًشح) ‪ ٝ‬رشـيَ رِي اُذ‪ٝ‬اٍ ثذ‪ ٕٝ‬اعزذػبء‪ٛ‬ب‬
‫طشاؽخً‪.‬‬

‫اُ٘ؾ‪ ٞ‬اُخبص ثبُزظشيؼ ػٖ اُـ ‪:ٞٛ Delegate‬‬


‫;) ]‪[access-modifier] delegate result-type identifier( [parameters‬‬

‫ؽيش ‪:‬‬

‫‪ٓ : access-modifier‬ؼشف اُذخ‪ ٍٞ‬اُ‪ ٠‬اٌُبئٖ ( ُٔضيذ ٖٓ أُؼِ‪ٓٞ‬بد اسعغ اُ‪ ٠‬اعبعيبد ُـخ ‪)C#‬‬

‫‪ًِٔ : Delegate‬خ ٓلزبؽيخ صبثزخ‬

‫‪ٞٗ :Result-type‬ع اُجيبٗبد اُز‪ ٠‬ي٘زغ‪ٜ‬ب اُـ ‪ ٝ Delegate‬اُز‪ ٠‬رزـبثن ٓغ اُذاُخ اُز‪ ٠‬يشيش اُي‪ٜ‬ب‬

‫‪ :identifier‬أعْ اُـ ‪Delegate‬‬

‫‪ :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‬‬

‫انذٔال انًجٕٓنت (‪)Anonymous Methods‬‬


‫رأَٓ اٌُ‪ٞ‬د اُزبُي‪:‬‬
‫;} ‪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‬رأخز ػ٘ظش ‪ٝ‬اؽذ ٖٓ اُ٘‪ٞ‬ع‬
‫‪ int‬صْ رو‪ ّٞ‬ثبخزجبس ‪ٛ‬زا اُؼ٘ظش ئرا ًبٕ ص‪ٝ‬ع‪ ٠‬اّ كشد‪ ,ٟ‬ئرا ًبٕ ص‪ٝ‬ع‪ ٠‬رو‪ ّٞ‬اُذاُخ ثبسعبع اُوئخ ‪,true‬‬
‫‪ٝ‬ئرا ًبٕ كشد‪ ٟ‬رؼ‪ٞ‬د ثبُوئخ ‪ .false‬صْ عبء ‪ٛ‬زا اُغـش ‪:‬‬
‫;)‪int[] EvenNumber = Array.FindAll(numbers, IsEven‬‬

‫‪ٞٓ ٠ٛ ٝ FindAll‬ع‪ٞ‬دح ك‪ ٠‬اُلئخ ‪ ,Array‬رِي اُذاُخ رأخز‬ ‫ك‪ٛ ٠‬زا اُغـش هٔ٘ب ثبعزذػبء داُخ اعٔ‪ٜ‬ب‬
‫ػ٘ظشيٖ‪ ,‬األ‪ ٍٝ‬ػجبسح ػٖ ‪ ٝ array‬اُضبٗ‪ ٠‬يغت إٔ يٌ‪ ٕٞ‬ششؽ ( ‪ ٝ ,)Condition‬اُششؽ ًٔب ‪ٞٛ‬‬
‫ٓؼش‪ٝ‬ف ك‪ُ ٠‬ـبد اُجشٓغخ يزْ اُزؾون ٓ٘‪ٝ ٚ‬ئرا رؾون اُششؽ ك‪ ٠‬رِي اُؾبُخ يٌ‪ ٝ True ٕٞ‬ئرا ُْ يزؾون ك‪ٜٞ‬‬
‫يٌ‪ُ .False ٕٞ‬زُي هٔ٘ب ثاٗشبء اُذاُخ ‪ ٠ً IsEven‬رزؾون ٖٓ اُششؽ ئرا ًبٕ ‪ False‬أّ ‪ٝ .True‬هٔ٘ب‬
‫ثاعزذػبئ‪ٜ‬ب ًؼ٘ظش ٖٓ ػ٘بطش اُذاُخ ‪.FindAll‬‬

‫ع‪ٞ‬ف رو‪ ّٞ‬اُذاُخ ‪ FindAll‬ثوشائخ أُظل‪ٞ‬كخ اُز‪ ٠‬اػـيذ ُ‪ٜ‬ب‪ ٝ ,‬ػ٘ذ ًَ ػ٘ظش ع‪ٞ‬ف رو‪ ّٞ‬ثزـجين اُذاُخ‬
‫‪ IsEven‬ػِي‪ ,ٚ‬ئرا ًبٗذ اُ٘زيغخ ‪ True‬كغ‪ٞ‬ف رؼ‪ٞ‬د اُذاُخ ‪ FindAll‬ثزُي اُؼ٘ظش‪ٝ ,‬ئرا ًبٗذ اُ٘زيغخ ‪False‬‬
‫‪ 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 + " " );
}
}
}

٠‫ رذػ‬٠‫ اُز‬interface ‫ّ ثزـجين اُـ‬ٞ‫ رو‬٠‫اُز‬ٝ DaysOfWeek ٠ٔ‫د هٔ٘ب ثاٗشبء كئخ رغ‬ٌُٞ‫زا ا‬ٛ ٠‫ك‬
٠ِ‫ ػ‬interface ‫ ثزـجين رِي اُـ‬.) Interfaces ‫ْ اُـ‬ٜ‫ ٓشعغ ُل‬ٟ‫ أ‬٠ُ‫دح ا‬ٞ‫ اُؼ‬٠‫ ( يشع‬.IEnumerable
ٕ‫ كا‬yield ‫ ئرا ًبٕ ثذاخَ رِي اُذاُخ ًِٔخ‬.GetEnumerator() ٠ٔ‫ اُلئخ داُخ رغ‬ٟ‫ أطجؼ ُذ‬,‫رِي اُلئخ‬
٠‫ رذػ‬٠‫ اُز‬interface ‫ّ ثزـجين اُـ‬ٞ‫ُيذ كئخ عذيذح رو‬ٞ‫ّ ثز‬ٞ‫يو‬ٝ iterator ‫ب‬ٜٗ‫ ئ‬٠ِ‫أُزشعْ يؾذد رِي اُذاُخ ػ‬
ٝ MoveNext ‫ٔب‬ٛ ٝ interface ‫ب رِي اُـ‬ٜ‫ي‬ٞ‫ رؾز‬٠‫اٍ اُز‬ٝ‫ُيذ اُذ‬ٞ‫ّ ثز‬ٞ‫ايؼبً يو‬ٝ IEnumerator
‫ب ر٘ليز داُخ‬ٜ‫ ًَ ٓشح يزْ كي‬٠‫ ك‬.iterator ‫ ثبعزخذاّ اُـ‬Loop َٔ‫ صْ ثؼذ رُي هٔ٘ب ثؼ‬.Dispose
ْ‫سح اُضبٗيخ يز‬ٝ‫ اُذ‬٠‫ صْ ك‬.‫هق‬ٞ‫اؽذح صْ يز‬ٝ yield ‫ يزْ ر٘ليز عِٔخ‬iterator ‫دح ثذاخَ اُـ‬ٞ‫ع‬ُٞٔ‫ ا‬MoveNext
.ً‫بئيب‬ٜٗ ‫هق‬ٞ‫ب يز‬ٛ‫ػ٘ذ‬ٝ yield break ‫ عِٔخ‬٠ُ‫ يظَ ا‬٠‫ٌزا ؽز‬ٛٝ ‫هق‬ٞ‫ر٘ليز اُغِٔخ اُضبٗيخ صْ يز‬

:ً‫د ششؽبً أًضش رلظيال‬ٌُٞ‫دػ٘ب ٗششػ ا‬


IEnumerator myEnumerator = week.GetEnumerator();

.‫ب‬ٛ‫ُيذ‬ٞ‫ّ أُزشعْ ثز‬ٞ‫ يو‬٠‫ ٖٓ اُلئخ اُز‬myEnumerator ٖ‫٘ب هٔ٘ب ثبشزوبم اٌُبئ‬ٛ

myEnumerator.MoveNext()

ٚ‫س كي‬ٝ‫ يذ‬ٟ‫ أُغبٍ اُز‬٠ٜ‫ اٗز‬ٝ‫ أ‬yield break ‫عذ أُزشعْ عِٔخ‬ٝ ‫ ئرا‬.yield ‫ٍ عِٔخ‬ٝ‫٘ب يزْ ايغبد أ‬ٛ
.while ‫ عِٔخ‬٠ٜ‫ر٘ز‬ٝ false ‫ ثبُوئخ‬MoveNext ‫د داُخ‬ٞ‫ف رؼ‬ٞ‫كغ‬
myEnumerator.Current

.yield ‫ب عِٔخ‬ٜ‫د ث‬ٞ‫ رؼ‬٠‫رِي اُغِٔخ رؾزلظ ثبُوئخ اُز‬

:٠ُ‫ ًبُزب‬٠ٜ‫زا اُجشٗبٓظ ك‬ٛ ‫أٓب ٗزيغخ ر٘ليز‬


Sun Tue Thr

12
‫ييزاث ‪C# 3.0‬‬
‫اإلطذاس ‪ C# 3.0‬ؽشى ُـخ ‪ C#‬ك‪ ٠‬ئرغب‪ ٙ‬اُِـخ اُ‪ٞ‬ظيليخ‪ٝ .‬رُي ثزوذيْ أعِ‪ٞ‬ة أًضش رظشيؾبً‪ ٝ .‬رغزخذّ‬
‫‪ LINQ‬عٔيغ أُيضاد اُغذيذح ك‪ C# 3.0 ٠‬روشيجبً‪ ٝ ,‬رِي أُٔيضاد رغؼِ٘ب هبدسيٖ ػِ‪ً ٠‬زبثخ ً‪ٞ‬د أًضش‬
‫ثغبؿخ ‪ٝٝ‬ػ‪ٞ‬ػ‪.‬‬

‫استُتاج انُٕع (‪)Local Type Inference‬‬


‫ئعز٘زبط اُ٘‪ٞ‬ع يؼزجش ٓيضح سائؼخ ك‪ ٠‬أ‪ُ ٟ‬ـخ‪ .‬ك‪ ٜٞ‬يغؼِي رٌزت اٌُ‪ٞ‬د ثٔ٘ز‪ ٠ٜ‬اُشاؽخ ‪ ٝ‬د‪ ٕٝ‬رؾذيذ ٗ‪ٞ‬ع‬
‫أُزـيش ا‪ ٝ‬اٌُبئٖ اُز‪ ٟ‬رزؼبَٓ ٓغ‪ .‬كبُٔزشعْ اُخبص ثبُِـخ يو‪ ّٞ‬ثبعز٘زبط ٗ‪ٞ‬ع أُزـيش أ‪ ٝ‬اٌُبئٖ‪ٝ ,‬رُي‬
‫ثزؾِيَ اُوئخ أُ‪ٞ‬ع‪ٞ‬دح ك‪ ٠‬أُزـيش أ‪ ٝ‬اٌُبئٖ ‪ ٝ‬رؾذيذ ٗ‪ٞ‬ػ‪ٜ‬ب‪.‬‬

‫روذّ ‪ٓ 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‬داخَ عغْ اُذاُخ ‪ ValidUse‬د‪ ٕٝ‬أ‪ٓ ٟ‬شٌِخ‪ ,‬اٌُ‪ٞ‬د اُزبُ‪٠‬‬
‫ي‪ٞ‬ػؼ أُبًٖ اُز‪ ٠‬ال يغٔؼ كي‪ٜ‬ب ثزؼشيق ٓزـيشاد ‪.var‬‬
‫{ ‪class VarDemo‬‬

‫;‪var k =0‬‬ ‫ال جيوز تعريف هتغري جمهول ىف جسن الفئت هببشرة ‪//‬‬

‫ال جيوز للعٌبصر املوجودة ىف توقيع الدالت أى تكوى جمهولت ‪//‬‬


‫}{ )‪public void InvalidUseParameter( var x‬‬

‫ال جيوز تعريف دالت جمهولت الٌوع ‪//‬‬


‫{ )(‪public var InvalidUseResult‬‬
‫;‪return 2‬‬
‫}‬

‫{ )(‪public void InvalidUseLocal‬‬


‫;‪var x‬‬ ‫خطأ ىف الٌحو ال يوجد عالهت = ‪//‬‬
‫‪var y = null‬‬ ‫ال ميكي استٌتبج ًوع املتغري هي القيوت ‪// null‬‬
‫}‬
‫}‬

‫ك‪ ٠‬اٌُ‪ٞ‬د اُغبثن‪ ,‬أُلزشع ئٕ أُزشعْ يغزـيغ اعز٘زبط ٗ‪ٞ‬ع أُزـيش ‪ٝ K‬رُي ٖٓ خالٍ اُوئخ أُجذئيخ‬
‫ُِٔزـيش‪ٛ ٌُٖ .‬زا ؿيش ٓغٔ‪ٞ‬ػ ث‪ ٚ‬ك‪ٛ ٠‬زا أٌُبٕ ٖٓ اٌُ‪ٞ‬د‪ .‬ايؼبً اُذاُخ ‪ ٖٓ InvalidUseResult‬أٌُٖٔ‬
‫اعز٘زبط ٗ‪ٞ‬ع اُ٘زيغخ اُز‪ ٠‬رؼ‪ٞ‬د ث‪ٜ‬ب‪ٛ ٌُٖ ,‬زا ؿيش ٓغٔ‪ٞ‬ػ ث‪ ,ٚ‬كالثذ ٖٓ رؾذيذ ٗ‪ٞ‬ع اُذُخ ٖٓ هجَ أُجشٓظ‪.‬‬

‫تؼبيراث نًذا (‪)Lambda Expressions‬‬


‫ًٔب رًشٗب عبثوبً ئٕ هـؼخ اٌُ‪ٞ‬د ػجبسح ػٖ رؾضيْ ُٔغٔ‪ٞ‬ػخ ٖٓ اُغَٔ اُجشٓغيخ ث‪ٜ‬زف ر٘ليز‪ٛ‬ب ٓغ ثؼغ ك‪٠‬‬
‫‪ٝ‬هذ ‪ٝ‬اؽذ ا‪ ٝ‬ػذّ ر٘ليز‪ٛ‬ب ػِ‪ ٠‬اإلؿالم‪ُ .‬زُي ػ٘ذٓب ٗؾزبط اُ‪ً ٠‬زبثخ هـؼخ ٖٓ اٌُ‪ٞ‬د ثذاخَ اُجشٗبٓظ ك٘و‪ّٞ‬‬
‫ثؼَٔ داُخ رؾز‪ ٟٞ‬ػِ‪ ٠‬هـؼخ اٌُ‪ٞ‬د‪.‬‬

‫اٌُ‪ٞ‬د اُزبُ‪ ٠‬ػجبسح ثشٗبٓظ ثغيؾ‪ ,‬هٔ٘ب ثاٗشبء ‪ 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 ‫ب‬ٜٔ‫ اُذاُخ اُضبٗيخ اع‬,ٖ‫د اُغبثن ػجبسح ػٖ داُزي‬ٌُٞ‫ا‬
.string ٚ‫ػ‬ٞٗ ٝ name ٠‫رزؼبَٓ ٓغ ػ٘ظش يذػ‬ٝ – ‫د‬ًٞ ‫ايؼبً هـؼخ‬

‫ب‬ٜ٘‫ رؾذص٘ب ػ‬٠‫ اُز‬ٝ )Anonymous Methods ( ‫ُخ‬ٜٞ‫اٍ أُغ‬ٝ‫ رْ روذيْ اُذ‬C# ‫ ٖٓ ُـخ‬٠ٗ‫ اإلطذاس اُضب‬٠‫ك‬
‫د‬ٌُٞ‫ ا‬٠ِ‫ ُزُي ئٌ٘٘ب اُزؼذيَ ػ‬,‫اؽذح‬ٝ ‫د ُٖ رغزخذّ ئال ٓشح‬ٌُٞ‫ ؽبُخ ئرا ًبٗذ هـؼخ ا‬٠‫ ٓليذح ك‬٠ٛ ٝ .ً‫عبثوب‬
:٠ُ‫اُغبثن ُيظجؼ ًبُزب‬
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 ‫ؽيش‬

)Extension Methods( ‫انذٔال اإلضافيت‬


٠ِ‫ ػ‬ٟٞ‫ ئرا ًبٕ ػ٘ذٗب كئخ رؾز‬ٚٗ‫ ا‬ٟ‫ ا‬.‫اٍ اإلػبكيخ رؼَٔ ًبٓزذاد ٌُِبئ٘بد‬ٝ‫ كإ اُذ‬,ْ‫اػؼ ٖٓ األع‬ٝ ٞٛ ‫ًٔب‬
.Extension Methods ‫زا اٌُبئٖ ػٖ ؿشين‬ُٜ ٍ‫ا‬ٝ‫ ئٌ٘٘ب ئػبكخ د‬.ٖ‫ أعز٘غخ٘ب ٖٓ رِي اُلئخ ًبئ‬ٝ ,ٖ‫داُزي‬

:String ‫ ُ٘غخخ ٖٓ اُلئخ‬IsVaildEmailAddress ٠‫ّ ثاػبكخ داُخ عذيذح رذػ‬ٞ‫ يو‬٠ُ‫أُضبٍ اُزب‬
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 ‫ػ٘ذٓب ٗأخز ٗغخخ ٖٓ اُلئخ‬
.customerEmailAddress ٠‫ يذػ‬string ‫ّ ثزؼشيق‬ٞ‫زا اُغـش يو‬ٜ‫ ك‬,‫اُغبثن‬
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
.ٚ‫ف رؼبف اُي‬ٞ‫ ع‬ٟ‫اٌُبئٖ اُز‬

Object Initialization Expressions


:‫اكزشع إٔ ُذي٘ب اُلئخ اُزبُيخ‬
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() {}

}
: ٠ُ‫ّ ثٌزبثخ اُشـش اُزب‬ٞ‫ئرا اسدٗب ئشزوبم ًبئٖ ٖٓ رِي اُلئخ ك٘ؾٖ ٗو‬
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" },‬‬
‫;}‬

‫األَٕاع انًجٕٓنت (‪)Anonymous Type‬‬


‫اٗظش اُ‪ ٠‬اٌُ‪ٞ‬د اُزبُ‪:٠‬‬
‫;} ‪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
ٖ‫ ػجبسح ػ‬٠ُ‫د اُزب‬ٌُٞ‫ ا‬.‫ يغت إٔ ٗجذأ ثٔضبٍ ثغيؾ‬,)Query Syntax ( ّ‫ اُخبص ثبإلعزؼال‬ٞ‫ْ اُ٘ؾ‬ٜ‫ ٗل‬٠ً
:Age ٝ Name, Language ‫ صالس ٓزـيشاد‬٠ِ‫ ػ‬ٟٞ‫ رؾز‬ٝ Developer ‫ب‬ٜٔ‫كئخ اع‬
public class Developer
{
public string Name;
public string Language;
public int Age;
}

‫زا‬ٛ ٖٓ ‫ػخ‬ٞٔ‫ ػجبسح ػٖ ٓغ‬array ‫ إ ػ٘بطش اُـ‬ٟ‫ ا‬.‫ اُلئخ ثذاخَ اُزاًشح‬ٙ‫ز‬ٛ ٖٓ array ‫٘بى‬ٛ ‫رخيَ أٗي‬
:٠ُ‫د اُزب‬ٌُٞ‫ ا‬٠ُ‫ اٗظش ا‬.array ‫دح ثزِي اُـ‬ٞ‫ع‬ُٞٔ‫ رشيذ إٔ رغزؼِْ ػٖ رِي اٌُبئ٘بد ا‬ٝ .Developer ٖ‫اٌُبئ‬
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‬‬ ‫‪ .Query Expression‬ئٕ اإلعزؼالّ اُغبثن عضء ٖٓ‬ ‫هجَ إٔ ٌَٗٔ يغت إٔ رؼِْ ٓب ‪ٞٛ‬‬
‫‪ُ ٞٛ .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‬‬

‫الؽظ إٔ ‪ٌٓ Select ٝ Where‬ز‪ٞ‬ة ثؼذ‪ٛ .Lambda Expression ْٛ‬ز‪ ٙ‬اُـ ‪Lambda Expression‬‬
‫رزشعْ اُ‪ٓ ٠‬غٔ‪ٞ‬ػخ ٖٓ ‪.generic delegate‬‬

‫‪22‬‬
‫َذٕ اإلستؼالو انكايم (‪)Full Query Syntax‬‬
‫ًٔب رؼِٔ‪ ٕٞ‬دائٔبً ر‪ٞ‬عذ ٓشبًَ ػ٘ذ رشعٔخ أُظـِؾبد اُؼِٔيخ‪ ,‬كبُؼِْ يزؾذس اإلٗغِيضيخ ُزُي‬
‫كبُٔظـِؾبد ك‪ ٠‬األعبط ثبُِـخ اإلٗغِيضيخ‪ٝ .‬ػ٘ذ ٓؾب‪ُٝ‬خ رشعٔخ رِي أُظـِؾبد ر٘زظ أعٔبء ؿشيجخ‬
‫‪ٝ‬اؽيبٗبً رغجت اسرجبى ُٔزِو‪ ٠‬أُؼِ‪ٓٞ‬خ‪ُ .‬زُي‪ٗ ,‬ظيؾخ‪ ...‬ا‪ٛ‬زْ ثبُٔظـِؼ اإلٗغِيض‪ ٟ‬كبُٔظـِؼ اُؼشث‪ ٠‬ؿبُجبً‬
‫ٓب يٌ‪ ٕٞ‬ؿيش ٓ٘بعت‪ .‬اٗب شخظيبً ال اعزغيؾ رشعٔخ ‪ .Full Query Syntax‬ك‪ ٠ٜ‬ثبُِـخ اُؼشثيخ رٌبد رٌ‪ٕٞ‬‬
‫ؿيش ٓل‪ٜٓٞ‬خ‪ .‬أُ‪ ...ْٜ‬دػي ٖٓ ًَ ‪ٛ‬زا ‪ ٝ‬رؼبُ‪ٗ ٠‬ش‪ٓ ٟ‬ب ‪ٛ ٞٛ‬زا اُـ ‪.Full Query Syntax‬‬

‫اػزوذ اٗي الؽظذ اٗ٘ب ٌٗزت ًِٔخ ‪ 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‬ؼشكخ‬
‫اعٔبء اُؼ٘بطش أُؾزِٔخ ألٗ‪ ٚ‬ال يؼشف ٖٓ ا‪ٓ ٟ‬ظذس ثبُؼجؾ ع‪ٞ‬ف رأر‪ ٠‬اُجيبٗبد‪ .‬آب ُ‪ً ٞ‬زج٘ب ًِٔخ‬
‫‪ From‬ك‪ ٠‬ا‪ ٍٝ‬اإلعزؼالّ كج‪ٜ‬زا ٗخجش ‪ٓ Visual Studio‬ظذس اُجيبٗبد أ‪ٝ‬الً‪ .‬ثبُزبُ‪ ٠‬يزؼشف ‪Visual‬‬
‫‪ 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

.Products ٍٝ‫ ٖٓ عذ‬٠‫زا اُؼ٘ظش يأر‬ٛٝ p ٚٔ‫ اُغـش اُغبثن هٔ٘ب ثزؾذيذ اعْ ُِؼ٘ظش اع‬٠‫ك‬

‫ب ػذح‬ٛ‫ ثؼذ‬٠‫ ئٌٖ إ يأر‬ٚٗ‫ ثَ ا‬.ٟ‫ اخش‬form ‫ب ػجبسح‬ٛ‫ ثؼذ‬٠‫ إ رأر‬form ‫ ئٌٖ ُؼجبسح‬.‫ظخ ثغيـخ‬ٞ‫ِٓؾ‬
.join ‫ب ػذح ػجبساد‬ٛ‫ ثؼذ‬٠‫ئٌٖ ايؼبً إ يأر‬ٝ .‫اؽذح‬ٝ ‫ُيظ ػجبسح‬ٝ form ‫ػجبساد‬

Select expr

.expression ٌَ‫ ش‬٠‫ يٌزت ك‬ٞٛ ٝ ,ٍٝ‫ب ٖٓ اُغذ‬ٜ‫ف ٗغزشعؼ‬ٞ‫ ع‬٠‫ٍ اُز‬ٞ‫ اُؾو‬ٝ‫ اُؾوَ أ‬ٞٛ expr ‫ؽيش‬

24
‫‪Group expr by key‬‬

‫ؽيش ‪ ٞٛ key‬اُؾوَ اُز‪ ٟ‬ع‪ٞ‬ف ٗؼَٔ ث‪.group ٚ‬‬

‫‪Let id = expr‬‬

‫رغزخذّ ُؼَٔ اعزؼالٓبد كشػيخ أ‪ًٔ ٝ‬ب يـِن ػِي‪ٜ‬ب ‪.Sub-Queries‬‬

‫‪Where condition‬‬

‫‪ where‬ثؼَٔ كِزش ُِجيبٗبد ‪ٝ‬رُي‬ ‫ؽيش ‪ ٞٛ condition‬اُششؽ أ‪ٓ ٝ‬غٔ‪ٞ‬ػخ اُشش‪ٝ‬ؽ‪ .‬ؽيش رو‪ ّٞ‬ػجبسح‬
‫ثبُجؾش ػٖ ثيبٗبد ُ‪ٜ‬ب شش‪ٝ‬ؽ ٓؾذدح‪.‬‬

‫‪Join id in source on expr equals expr‬‬

‫‪ ٠ٛٝ‬رو‪ ّٞ‬ثزؾذيذ شٌَ اُؼالهخ ثيٖ اٌُي٘‪ٗٞ‬بد أ‪ ٝ‬اُغذا‪.ٍٝ‬‬

‫]‪Orderby ordering, ordering, ...[Ascending | Descending‬‬

‫‪ ٠ٛٝ‬رو‪ ّٞ‬ثزشريت ػشع اُجيبٗبد ئٓب ر٘بصُيبً أ‪ ٝ‬رظبػذيبً‪ .‬ػِ‪ ٠‬ؽغت هئخ ؽوَ أ‪ ٝ‬اًضش ٖٓ ؽوَ‪.‬‬

‫‪into id query‬‬

‫‪ٝ‬ػغ اُ٘زيغخ ك‪ٌٓ ٠‬بٕ ٓإهذ ُإلعزؼالّ ٓ٘‪ٜ‬ب‪ .‬ش‪٠‬ء ٓب ٓشبث‪ُ ٚ‬ؼِٔيخ اإلعزؼالٓبد اُلشػيخ‪.‬‬

‫ٓب عجن ػجبسح ػٖ ٓشعغ ع‪ٞ‬ف ٗشعغ اُي‪ ٚ‬ػ٘ذ اُؾبعخ اُ‪ً ٠‬زبثخ اعزؼالّ‪ٝ .‬ع‪ٞ‬ف ٗل‪ ًَ ْٜ‬ش‪٠‬ء ػٖ رِي‬
‫اُؼجبساد اص٘بء اُششػ‪ ....‬ال روِن ك٘ؾٖ ُْ ٗجذأ ششػ ثؼذ ‪.‬‬

‫‪25‬‬
Query Operators
‫ف رغجت ثؼغ اإلسرجبى كٌِٔخ‬ٞ‫ب اُؾشكيخ ع‬ٜ‫ ألٕ رشعٔز‬,Operators ٠٘‫ّ ثزشعٔخ ٓؼ‬ٞ‫ أُشح ُٖ أه‬ٙ‫ز‬ٛ
.Operator ٠ٛ ‫ب ًٔب‬ٛ‫ ٌُ٘٘ب ٗشيذ‬.َٓ‫ اُؼب‬ٝ‫ أُشـَ ا‬٠٘‫ رؼ‬Operator

LINQ ‫ضح ٓغ‬ٛ‫ عب‬٠‫اٍ رأر‬ٝ‫ ػجبسح ػٖ د‬٠ٜ‫ ك‬.‫ب‬ٜ‫ػبً ػٖ رشعٔز‬ٞ‫ ػ‬Operators ٖٓ ‫د‬ٞ‫ئٌ٘٘ب ششػ أُوظ‬
‫ اعزخذّ رِي‬٠ِ‫ ئٕ اإلعزؼالّ يظجؼ هبدس ػ‬ٟ‫ ا‬.ٚ‫ّ ثاٗشبئ‬ٞ‫ اعزؼالّ رو‬ٟ‫ ا‬٠ُ‫ب ا‬ٜ‫اٍ يزْ رخظيظ‬ٝ‫ رِي اُذ‬ٝ
.‫ اُخبطخ‬ٚ‫ ػِٔيبر‬٠‫اٍ ك‬ٝ‫اُذ‬

.LINQ ‫ ٓغ‬٠‫ رأر‬٠‫ اُز‬Operators ‫ػؼ عٔيغ اُـ‬ٞ‫ ي‬٠ُ‫ٍ اُزب‬ٝ‫اُغذ‬

LINQ Query Operators :2.1 ‫جذٔل‬

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

‫ف‬ٞ‫ اُظل‬٠‫ صْ هٔذ ثؼشة األػٔذح ك‬13 ْٜ‫عذر‬ٝٝ ‫ف‬ٞ‫ػذدد اُظل‬ٝ 4 ْٜ‫عذر‬ٝٝ ‫أساى هذ هٔذ ثؼذ األػٔذح‬
51 ْٜٗ‫ ؽبٍ ا‬ٟ‫ أ‬٠ِ‫ ً٘ذ عأخجشى ػ‬...51 ‫اؽذ ٖٓ اُ٘برظ كأطجؼ‬ٝ ‫ صْ هٔذ ثـشػ‬52 ْٜ‫عز‬ٝٝ
.‫يب ٗجذأ‬ٛ .ًِْٜ ْٜ‫ عأششؽ‬٠ٗ‫أُلبعأح ا‬ٝ .Operator

26
‫‪ ٠ٛ Operators‬ػ٘بطش ٓغٔ‪ٞ‬ػبد‬ ‫اُؼ٘بطش ( ‪ )Elements‬اُز‪ ٠‬ع‪ٞ‬ف رزًش ك‪ ٠‬ششػ اُـ‬
‫(‪ٓ )collections‬ضَ أُظل‪ٞ‬كبد أ‪ ٝ‬اُـ ‪ List‬ا‪ٓ ٝ‬ب شبث‪ .ٚ‬ا‪ ٟ‬اٗ‪ٜ‬ب ػ٘بطش رؾز‪ ٟٞ‬ػِ‪ٓ ٠‬غٔ‪ٞ‬ػخ ػ٘بطش‪.‬‬

‫‪Aggregate‬‬
‫‪ َٛ‬عٔؼذ ػٖ اُغٔغ أُزٌشس؟‪ٓ .‬ضالً ػ٘ذى األسهبّ األريخ ( ‪ ٝ ) 1, 2, 3, 4, 5, 6‬رشيذ عٔؼ‪ٜ‬ب عٔغ ٓزٌشس‪.‬‬
‫‪ ٞٛٝ‬ثإٔ رغٔغ أ‪ ٍٝ‬ػ٘ظش ٓغ صبٗ‪ ٠‬ػ٘ظش ‪ ٝ‬اُ٘برظ رغٔؼ‪ٓ ٚ‬غ صبُش ػ٘ظش ‪ ٝ‬اُ٘برظ رغٔؼ‪ٓ ٚ‬غ ساثغ‬
‫ػ٘ظش ‪ٌٛٝ‬زا ؽز‪ ٠‬أخش اُؼ٘بطش‪ .‬يو‪ Aggregate operator ّٞ‬ثزِي اُؼِٔيخ ع‪ٞ‬اء ًبٗذ عٔغ أ‪ ٝ‬ػشة‬
‫أ‪ ٝ‬ايبً ٓب ًبٗذ‪ .‬اٗظش أُضبٍ اُزبُ‪:٠‬‬
‫;}‪int[] ints = {1, 2, 3, 4, 5, 6‬‬
‫لي أكتب اإلستعالم ًفسه فلي حنتبجه ىف الشرح ‪var query = from ...; //‬‬
‫;) ‪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‬اُزيٖ يغزشعؼ‪ ْٜ‬اإلعزؼالّ ُذي‪ ْٜ‬سهْ ‪ٛ‬برق‪.‬‬
‫;)(‪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‬‬

‫ؿجؼبً اُ٘زيغخ رٌ‪ True ٕٞ‬أ‪.False ٝ‬‬

‫‪Any‬‬
‫يو‪ٛ ّٞ‬زا اُـ ‪ operator‬ثلؾض ٓظذس اُجيبٗبد ‪ ٝ‬اُجؾش ػٖ ا‪ ٟ‬ػ٘ظش يؾون ثؼغ اُشش‪ٝ‬ؽ أُـِ‪ٞ‬ثخ‪.‬‬
‫كِ٘لزشع اٗي رشيذ ٓؼشكخ ‪٘ٛ َٛ‬بى أ‪ Doctor ٟ‬يؼيش ك‪ٓ ٠‬ذي٘خ اُوب‪ٛ‬شح‪:‬‬
‫;)(‪Doctors doctors = new Doctors‬‬
‫;) "‪bool inCairo = doctors.Ant( doc => doc.City == "Cairo‬‬

‫اُ٘زيغخ ‪ True‬أ‪.False ٝ‬‬

‫‪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 ً‫ٕ اُ٘برظ ٓضال‬ٌٞ‫ي‬ٝ ‫ ػذد أيبّ اُغ٘خ‬ٞٛٝ

ٌٕٞ‫ ر‬avg2 ‫أُزـيش‬ٝ .‫ب‬ٛ‫ ػذد‬٠ِ‫ٓخ ػ‬ٞ‫ ٓوغ‬ints ْ‫ع هي‬ٞٔ‫ ٓغ‬ٞٛٝ 3.5 ٟٝ‫ رغب‬ٚ‫ هئز‬avg1 ‫ثبُ٘غجخ ُِٔزـيش‬
‫ آب أُزـيش‬.ْ‫ هي‬4 ‫٘ب‬ٛ ٠ٛٝ ‫ب‬ٛ‫ ػذد‬٠ِ‫ٓخ ػ‬ٞ‫ ٓوغ‬values ٠‫ع اُويْ اُـيش كبسؿخ ك‬ٞٔ‫ ٓغ‬ٞٛٝ 2.5 ٚ‫هئز‬
.); ٚ‫عـ‬ٞ‫ يؾغت ُ٘ب ٓز‬٠ً ‫ ك٘ؾٖ ُْ ٗؾذد اعزؼالّ ٓؾذد‬,‫ ئال اهلل‬ٚ‫ كال يؼِْ هئز‬avg

Cast
.‫ع ٓؾذد‬ٞٗ ٠ُ‫اع اُؼ٘بطش ا‬ٞٗ‫يَ أ‬ٞ‫ّ يزؾ‬ٞ‫يو‬
ArrayList al = new ArrayList();
al.Add("abc");
al.Add("def");
al.Add("ghi");

var strings = al.Cast<string>();

.string ‫ع‬ُٞ٘‫ ا‬٠ُ‫ب ا‬ِٜ‫ي‬ٞ‫ رْ رؾ‬ArrayList ‫ع‬ُٞ٘‫ػخ ٖٓ اُؼ٘بطش ٖٓ ا‬ٞٔ‫د اُغبثن ٓغ‬ٌُٞ‫ا‬

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);

ّ‫ هب‬Concat Operator ٕ‫ أل‬.) 1, 2, 3, 4, 5, 6 ( ٟٝ‫ رغب‬all ‫د رظجؼ هئخ أُزـيش‬ٌُٞ‫زا ا‬ٛ ‫ثؼذ ر٘ليز‬
‫ ألٗ٘ب ُْ ٌٗزت‬ٚ‫ ال ٗؼِْ هئز‬result ‫أُزـيش‬ٝ .‫اؽذ‬ٝ ‫ ٓؼبً كأطجؾب ػ٘ظش‬ints2 ٝ ints1 ٖ‫طَ اُؼ٘ظشي‬ٞ‫ث‬
.‫ ًَ ٓشح‬٠‫زا ك‬ٛ ٍٞ‫ ُو‬٠‫ال داػ‬ٝ .ّ‫اعزؼال‬

Contains
ٚٔ‫ اع‬Doctor ‫٘بى‬ٛ َٛ ‫كِ٘لزشع اٗي رشيذ ٓؼشكخ‬.ٚ٘‫ هئخ ٓؼي‬٠ِ‫ ػ‬ٟٞ‫َ يؾز‬ٛ ‫يجؾش ثذاخَ اُؼ٘ظش‬
ْ‫ب اُوي‬ٜ‫ٗؼـي‬ٝ Doctor ٖ‫ّ ثؼَٔ ٗغخخ ٖٓ اٌُبئ‬ٞ‫ رِي اُؾبُخ ٗو‬٠‫ ك‬.‫؟‬٠‫ أُغزشل‬٠‫ ٓبصاٍ يؼَٔ ك‬Ahmed
:‫ب اّ ال‬ٜ‫ ػِي‬ٟٞ‫ ئرا ًبٕ اُؼ٘ظش يؾز‬ٟ‫ٗش‬ٝ , ‫ب‬ٜ٘‫ ٗجؾش ػ‬٠‫اُز‬
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");

Count
.)Collection( ‫ػخ‬ٞٔ‫ ٓغ‬ٟ‫ ثذاخَ ا‬٠‫ّ ثؼذ اُؼ٘بطش اُز‬ٞ‫يو‬
int[] ints = {1, 2, 3, 4, 5, 6 };
decimal?[] values = {1, null, 2, null, 3 };
IEnumerable<Doctor> doctors = new Doctors();
Var query = from ...;

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();

ٚ‫ كزظجؼ هئز‬Zero ‫ آب أُزـيش‬.ً‫ ُيظ كبسؿب‬ٚٗ‫رُي أل‬ٝ ints1 ‫ ٗلظ هئخ أُزـيش‬ٚ‫ رظجؼ هئز‬ints ‫أُزـيش‬
minus1 ‫اُؼ٘ظش‬ٝ .‫ طلش‬٠ٛ intٍ ‫اُوئخ اإلكزشاػيخ‬ٝ int ‫ع‬ُٞ٘‫ ٖٓ ا‬ٞٛٝ ً‫ كبسؿب‬ints2 ‫ ألٕ أُزـيش‬0
.-1 ٠ٛٝ ًُ‫هٔ٘ب ثزؾذيذ هئخ ئكزشاػيخ ئرا ًبٕ كبسؿب‬ٝ َ‫ كشاؽ‬ints2 ‫رُي ألٕ اُؼ٘ظش‬ٝ -1 ٚ‫رظجؼ هئز‬

Distinct
:‫ رٌشاساد‬ٟ‫ٕ ا‬ٝ‫ّ ثاسعبع اُ٘زبئظ ثذ‬ٞ‫يو‬
int[] ints = { 1, 2, 2, 3, 2, 3, 4 };
var query = from ...;

var distinctInts = ints.Distinct();


var distinctResult = query.Distinct();

.‫ رْ ؽزف ًَ اُؼ٘بطش أُزٌشسح‬ٚٗ‫ ا‬ٟ‫) ا‬1, 2, 3, 4 ( ٟٝ‫ رغب‬distinctInts ‫د رظجؼ هئخ‬ٌُٞ‫ثؼذ ر٘ليز ا‬

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
ْ‫ اُشرجخ سه‬٠‫ ) يؼزجش ك‬1 ( ْ‫ سه‬ints ‫ اُؼ٘ظش‬٠‫ ك‬ٚٗ‫ ا‬ٟ‫ ا‬0 ‫ رجذأ ٖٓ اُوئخ‬C# ٠‫ف ئٕ اُشرت ك‬ٝ‫ٖٓ أُؼش‬
.2 ٟٝ‫ رغب‬third ‫د رظجؼ هئخ أُزـيش‬ٌُٞ‫زا ا‬ٛ ‫ ثز٘ليز‬.ً‫ٌزا‬ٛٝ ‫اؽذ‬ٝ ْ‫ اُشرجخ سه‬٠‫ ) ك‬2 ( ْ‫سه‬ٝ 0

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);

‫ سرجخ عبدعخ‬ٚ‫عذ ث‬ٞ‫ ال ي‬ints ‫رُي ألٕ اُؼ٘ظش‬ٝ 0 ٟٝ‫ رغب‬x2 ‫هئخ أُزـيش‬ٝ .3 ٟٝ‫ رغب‬x1 ‫هئخ أُزـيش‬
.‫ سهْ خٔغخ‬ٚ‫ ثبُشرج‬٠ٜ‫ر٘ز‬ٝ ‫ عزخ ػ٘بطش كوؾ رجذأ ٖٓ اُشرجخ سهْ طلش‬٠ِ‫ ػ‬ٟٞ‫ يؾز‬ٜٞ‫ك‬

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);

.)2, 4, 5 ( ٟٝ‫ رغب‬diffInts ‫رظجؼ هئخ أُزـيش‬

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();

.1 ٟٝ‫ رغب‬first ‫د رظجؼ هئخ أُزـيش‬ٌُٞ‫ثز٘ليز ا‬

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 ();

.‫ كبسؿخ‬ints2 ‫ػخ‬ٞٔ‫ ألٕ أُغ‬,0 ٟٝ‫ رغب‬x2 ‫هئخ‬ٝ 1 ٟٝ‫ رغب‬x1 ‫د رظجؼ هئخ‬ٌُٞ‫ثز٘ليز ا‬

32
Fold
Aggregate Operator ‫ ُـ‬ٚ‫ ٓشبث‬Operator ‫زا اُـ‬ٛ ‫يؼزجش‬

GroupBy
‫زا ػجبسح‬ٛ ‫أُلزبػ‬ٝ )Key ( ‫كوبً ُٔلزبػ‬ٝ ‫ػخ‬ٞٔ‫دح داخَ ٓغ‬ٞ‫ع‬ُٞٔ‫ ثزغٔيغ اُؼ٘بطش ا‬Operator ‫زا اُـ‬ٛ ّٞ‫ثو‬
.ٚ‫ٗخ ُِؼ٘ظش ٗلغ‬ٌُٞٔ‫ػٖ اؽذ اُغضاء ا‬
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 );
}

‫أُزـيش‬ٝ .City ٞٛٝ ‫كوبً ُٔلزبػ‬ٝ ‫ ٓشرجخ‬doctors َ‫دح داخ‬ٞ‫ع‬ُٞٔ‫ اُؼ٘بطش ا‬٠ِ‫ ػ‬ٟٞ‫ يؾز‬groups ‫أُزـيش‬
‫ هئخ أُلزبػ‬ٙ‫ كزُي ٓؼ٘ب‬group.Key ‫ ُزُي ػ٘ذ ًزبثخ‬.groups َ‫اؽذ كوؾ داخ‬ٝ ‫ ػجبسح ػٖ ػ٘ظش‬group
.ْ‫اعـزخ اُوي‬ٞ‫ سرجذ ث‬ٟ‫اُز‬

:‫ٓضبٍ أخش‬
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);

.) 1, 3, 6 ( ٟٝ‫ رغب‬commonInts ‫ٍ إ هئخ أُزـيش‬ٞ‫ رِي اُؾبُخ ئٌ٘٘ب إٔ ٗو‬٠‫ك‬

Join
.SQL ٠‫ ك‬inner join ‫ب ٓضَ ػجبسح‬ِٜ‫ ٓض‬.‫ػزيٖ ٓؼبً ٖٓ خالٍ ٓلزبػ‬ٞٔ‫سثؾ ٓغ‬
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
LastOrDefault
.‫ب هيْ كبسؿخ‬ٜ‫ٕ ث‬ٌٞ‫ػخ يؾزَٔ إ ي‬ٞٔ‫ّ ثبعزشعبع أخش ػ٘ظش ٖٓ ٓغ‬ٞ‫يو‬
int[] ints1 = { 1, 2, 3, 4, 5, 6 };
int[] ints2 = { };
int x1 = ints1.LastOrDefault();
int x2 = ints2.LastOrDefault();

.0 ٟٝ‫ رغب‬x2 ‫هئخ أُزـيش‬ٝ .6 ٟٝ‫ رغب‬x1 ‫هئخ أُزـيش‬

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();

.5 ٟٝ‫ رغب‬values ‫ هئخ‬ٝ .6 ٟٝ‫ رغب‬count1 ‫هئخ‬

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();

.4 ٟٝ‫ رغب‬max2 ‫هئخ أُزـيش‬ٝ .6 ٟٝ‫ رغب‬max1 ‫هئخ أُزـيش‬

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‬رغب‪.) abc, def ( ٟٝ‬‬

‫‪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‬رغب‪) 6, 5, 4, 3, 2, 1 ( ٟٝ‬‬

‫‪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‬‬

‫‪ .ints‬آب أُزـيش ‪ names‬هٔ٘ب ثأخزيبس‬ ‫ك‪ ٠‬أُزـيش ‪sameInts‬هٔ٘ب ثبخزيبس ًَ اُؼ٘بطش أُ‪ٞ‬ع‪ٞ‬دح ك‪٠‬‬
‫األعْ األ‪ ٝ ٍٝ‬أعْ اُؼبئِخ كوؾ ٖٓ ثيبٗبد األؿجبء‪.‬‬

‫‪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‬اطجؼ هئز‪ ٚ‬رغب‪.) 1, 2, 3, 4, 5, 6 ( ٟٝ‬‬

‫‪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;

‫ هئخ‬ٟ‫ اُؼ٘ظش اُز‬ٞٛٝ doctors ‫ػخ‬ٞٔ‫اؽذ كوؾ ٖٓ أُغ‬ٝ ‫ يؾَٔ ػ٘ظش‬ٚٗ‫ ٗغذ ا‬doctor ‫ثبُ٘غجخ ُِٔزـيش‬
.ٚ‫زا أُزـيش األٕ يؾَٔ اُؼ٘ظش ًبَٓ ثٌَ ثيبٗبر‬ٛ .mb1 ٟٝ‫ رغب‬ٚ‫ كي‬Initials

SingleOrDefault
.‫ػخ كبسؿخ‬ٞٔ‫ٕ أُغ‬ٌٞ‫ اُغبثن ٓغ اؽزٔبُيخ إٔ ر‬Operator ‫ٗلظ اُـ‬

Skip
.ْٜ‫ ػذ ٓؼيٖ ٖٓ اُؼ٘بطش ؽغت رشريج‬٠‫ ثزخـ‬Operator ‫زا اُـ‬ٛ ّٞ‫يو‬
int[] ints = { 1, 2, 3, 4, 5, 6 };
var query = from ...;
var last3 = ints.Skip(3);
var bottom10 = query.Skip( query.Count() – 10 );

‫ّ ثؼذ‬ٞ‫ف يو‬ٞ‫ ع‬bottom10 ٝ .‫ٍ صالصخ ػ٘بطش‬ٝ‫ أ‬٠‫ رخـ‬ٚٗ‫رُي أل‬ٝ )4, 5, 6 ( ٟٝ‫ يغب‬last3 ...‫اُ٘زيغخ‬
.‫ أخش ػششح‬ٟ‫ف يغزشعغ عٔيغ اُؼ٘بطش ػذ‬ٞ‫ ثزُي ع‬10 ْٜ٘ٓ ‫ يـشػ‬ٝ ‫عٔيغ اُؼ٘بطش‬

SkipWhile
.ٖ‫ ئرا رؾون ششؽ ٓؼي‬٠ُ‫ اُؼ٘ظش اُؾب‬٠‫ رخـ‬ٟ‫أ‬
int[] ints = { 1, 2, 3, 4, 5, 6 };
var Last3 = ints.SkipWhile( x => x < 3 )

.) 4, 5, 6 ( ‫ رظجؼ‬Last3 ‫هئخ أُزـيش‬

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 ٠‬‬
‫ػ٘ظش ثبعزخذاّ ‪ Take‬ئٌ٘٘ب ٓضالً اعزشعبع أ‪ 10 ٍٝ‬ػ٘بطش كوؾ ٓغ ا‪ٔٛ‬بٍ اُجبه‪ .٠‬ئرا ًبٕ اُشهْ أُؾذد‬
‫‪ 0‬كبٕ اُ٘زيغخ ع‪ٞ‬ف رٌ‪ٕٞ‬‬ ‫إلعزشعبػ‪ ٚ‬أهَ ٖٓ ‪ 0‬كإ اُ٘زيغ‪ ٚ‬ع‪ٞ‬ف رٌ‪ ٕٞ‬كبسؿخ‪ٝ .‬ئرا ًبٕ أًجش ٖٓ‬
‫أُغٔ‪ٞ‬ػخ ًبِٓخ‪.‬‬
‫;} ‪int[] ints = { 1, 2, 3, 4, 5, 6‬‬
‫;‪var query = from ...‬‬
‫;)‪var first = ints.Take(3‬‬
‫;)‪var top10 = query.Take(10‬‬

‫ئٌٌْ٘ اعز٘زبط هئخ أُزـيش ‪.first‬‬

‫‪TakeWhile‬‬
‫اعزشعغ اُؼ٘بطش اُز‪ ٠‬رؾون ششؽ ٓؾذد‪ َٛ .‬رززًش ‪ SkipWhile Operator‬؟ ُوذ ًبٕ يزشى اُؼ٘ظش ئرا‬
‫ٓب رؾون ششؽ ٓؼيٖ‪ .‬آب ‪ TakeWhile‬ك‪ ٜٞ‬اُؼٌظ يأخز اُؼ٘ظش ئرا ٓب رؾون ششؽ ٓؼيٖ‪.‬‬

‫‪ThenBy‬‬
‫اٗظ ُ‪ٜ‬زا اٌُ‪ٞ‬د أ‪ٝ‬الً‪:‬‬
‫;)(‪Doctors doctors = New Doctors‬‬
‫;) ‪var docs = doctors.OrderBy(doc => doc.City).ThenBy(doc => doc.Name‬‬

‫ًٔب رالؽظ يزْ اعزخذاّ ‪ُ GroupBy‬زشريت اُؼ٘بطش ‪ٝ‬كوبً ُوئخ ‪ ,City‬صْ ثؼذ رشريت اُجيبٗبد يزْ رشريج‪ٜ‬ب ٓشح‬
‫اخش‪ٝ ٟ‬كوبً ُألعْ‪ .‬كِ٘لزشع اٗ‪ ٚ‬ك‪ ٠‬اُزشريت األ‪ ٞٛٝ ٍٝ‬اُزشريت اُوبئٔخ ػِ‪ City ٠‬إ ا‪ ٍٝ‬ػششح ػ٘بطش‬

‫‪39‬‬
٠‫ٌزا ك‬ٛٝ .Name ‫كوبً ُـ‬ٝ ْٜ‫ اُؼ٘بطش اُؼششح صْ يؼيذ رشريج‬ٙ‫ز‬ٛ ٠ِ‫ ػ‬ThenBy ٠‫ يأر‬,City ‫ْ ٗلظ هئخ‬ُٜ
.‫خ‬ٜ‫ ٓزشبث‬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
‫ ًَ طق‬.)two Dimension array( ٖ‫كخ راد اُجؼذي‬ٞ‫ أُظل‬ٚ‫ ًبئٖ يشج‬٠‫ب ك‬ٜ٘‫ رخضي‬ٝ ‫اعزشعبع اُجيبٗبد‬
.Dictionary<K, V> ٠ٔ‫زا اٌُبئٖ يغ‬ٛ .‫ف‬ٞ‫ اُظل‬٠‫كخ الثذ إٔ يؾَٔ هئخ ٓخزِلخ ػٖ ثبه‬ٞ‫ أُظل‬ٙ‫ز‬ٛ ٠‫ك‬
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 ٖ‫اٌُبئ‬
٠ٛ ‫ اُوئخ اُضبٗيخ‬ٝ doc.Initials ٠ٛ ُٚ ٠ُٝ‫ اُوئخ األ‬dictionary ٖ‫د اُغبثن اٗشبٗب ًبئ‬ٌُٞ‫ ا‬٠‫ ك‬.‫ثبُٔلزبػ‬
‫ال‬
ً ‫ كجذ‬.‫ ُيظ طق ثيبٗبد‬ٝ ‫اؽذ كوؾ‬ٝ ٕ‫ يظجؼ ثيب‬٠ً ٠ٗ‫ئٌٖ رؾذيذ اُؼ٘ظش اُضب‬ٝ .َٓ‫ ًب‬doctors ‫ػ٘ظش‬
.‫اؽذ كوؾ‬ٝ ٕ‫ ئٌ٘٘ب اخزيبس ثيب‬.ٚ‫ ثٌبَٓ ثيبٗبر‬doctors ‫ٖٓ إٔ يظجؼ ػ٘ظش‬

ToList
.List<T> ٖ‫ ًبئ‬٠‫ب ك‬ٜ٘‫ رخضي‬ٝ ‫اعزشعبع اُجيبٗبد‬

List<Doctor> Cairo – query.ToList();

40
‫‪ToLookup‬‬
‫اعزشعبع اُجيبٗبد ‪ ٝ‬رخضي٘‪ٜ‬ب ك‪ً ٠‬بئٖ >‪ٛ .Lookup<K, V‬زا اٌُبئٖ يغج‪ً ٚ‬بئٖ >‪ٌُٖ Dictionary<K, V‬‬
‫ُيظ ثبُؼش‪ٝ‬س‪ ٟ‬إٔ رٌ‪ ٕٞ‬اُويْ أُخضٗخ هيْ ٓ٘لشدح‪.‬‬

‫‪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‬رغب‪ًٔٝ .)1, 2, 3, 4, 6, 5 ( ٟٝ‬ب ٗالؽظ اٗ‪ ٚ‬اعزشعغ ثيبٗبد اُلئخ األ‪ ٠ُٝ‬ا‪ٝ‬الً‬
‫صْ اُلئخ اُضبٗيخ‪.‬‬

‫‪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‬؟‪ .‬ؽغ٘بً ٖٓ ؽوي ػِي٘ب إٔ ٗو‪ ّٞ‬ثاعبثخ رِي األعئِخ‪ُٔ ٌُٖ .‬ؼشكخ اإلعبثبد يغت ػِيي‬
‫إٔ رل‪ٓ ْٜ‬ب ‪ٞٔٗ ٞٛ‬رط اٌُي٘‪ٗٞ‬خ ( ‪ ) Entity Model‬اُخبص ثـ ‪ً ٝ LINQ to SQL‬زُي يغت إٔ رل‪ٓ ْٜ‬ب ‪ٞٛ‬‬
‫اإلعزؼالّ أُإعَ ( ‪.) Deferred Query‬‬

‫انكيَُٕاث فى ‪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‬‬
‫}‬

‫ك‪ ٠‬اُجبديخ هٔ٘ب ثزؼشيق ٓزـيش ٖٓ اُ٘‪ٞ‬ع ‪ var‬ا‪ ٟ‬اٗ‪ ٚ‬ؿيش ٓؾذد اُ٘‪ٞ‬ع ( ‪ٛٝ .)Anonymous Type‬زا‬
‫أُزـيش يؼجش ػٖ ٗزيغخ ر٘ليز ئعزؼالّ‪ٛٝ .‬زا اإلعزؼالّ رلظيِ‪ً ٚ‬بُزبُ‪: ٠‬‬

‫ٖٓ ‪ c‬أُ‪ٞ‬ع‪ٞ‬د ك‪ ٠‬عذ‪Customer ٍٝ‬‬

‫ػ٘ذٓب ‪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
َ‫ ث‬...‫زا‬ٛ ٠ُ‫ اُؾويوخ ؿبُجبً ٓب رؾزبط ا‬٠‫ ك‬...‫ ئػبدح اعزخذاّ ٗلظ اإلعزؼالّ ٓغ هيْ ٓخزِلخ‬٠ُ‫اؽيبٗبً رؾزبط ا‬
)ٖ‫ (رؾغي‬Optimization َٔ‫ ثؼ‬DBMS ‫ّ ثؼغ اُـ‬ٞ‫ رو‬,‫ ُزُي‬.‫زا‬ٛ ٠ُ‫ دائٔبً ٓب رؾزبط ا‬ٚٗ‫ اًبد أعضّ ا‬٠ٗ‫ا‬
)compilation ( ‫ ػِٔيخ رشعٔخ‬ٝ ‫رُي ُزؾغيٖ األداء‬ٝ )Application ( ‫ رـجين‬ٟ‫ُإلعزؼالّ أُغزوجَ ٖٓ ا‬
‫هذ‬ُٞ‫ ُٖ يؼيغ ا‬DBMS ‫ ألٕ اُـ‬,ٚ‫ اسعَ اإلعزؼالّ ٗلغ‬ٟ‫ صيبدح أداء اُزـجين اُز‬٠ُ‫ ا‬ٟ‫ رُي ُيإد‬.ّ‫اإلعزؼال‬
Optimization َٔ‫ اعزشاريغيخ ُؼ‬LINQ ّ‫ روذ‬.‫ب‬ٜ‫ كي‬ُٚ‫ ًَ ٓشح يزْ اسعب‬٠‫ أػبدح رؾِيَ اإلعزؼالّ ك‬٠‫ك‬
SQL ‫ُيذ اعزؼالّ ٓ٘بعت ثِـخ‬ٞ‫ ثز‬LINQ ‫ّ ٓؾشى‬ٞ‫ يو‬,ّ‫ّ ثبسعبٍ اإلعزؼال‬ٞ‫ ًَ ٓشح رو‬٠‫ ٌُٖ ك‬,ّ‫ُإلعزؼال‬
ّ‫رُي ػٖ ؿشين اعزخذا‬ٝ Optimization َٔ‫ ؿشيوخ عيذح ُؼ‬LINQ ‫ ُزُي روذّ ُي‬.DBMS ٠ُ‫ ا‬ُٚ‫إلسعب‬
‫ ًَ ٓشح‬٠‫ رشعٔخ اإلعزؼالّ ك‬٠ُ‫ ثبعزخذاّ رِي اُلئخ ُٖ يؾزبط أُزشعْ ا‬.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‬‬

‫يجذ‪ ٝ‬أثغؾ ‪ ...‬اٌُ‪ٞ‬د اُغبثن ثبُشؿْ ٖٓ اٗ‪ ٚ‬عِٔخ ‪ٝ‬اؽذح ئال اٗ‪ٗ ٚ‬زيغخ ر٘ليز‪ ( ٙ‬اُخبطخ ثبألداء ‪ُٝ‬يظ ثبُؼبئذ )‬
‫ٓزشبث‪ٜ‬خ ٖٓ اٌُ‪ٞ‬د اُز‪ ٟ‬هجِ‪ .ٚ‬ك‪ ٠‬اُؾويوخ ئيغبد ؿشيوخ ٓ٘بعجخ ُِذخ‪ ٍٞ‬اُ‪ ٠‬اُجيبٗبد رؼزٔذ ػِ‪ ٠‬عٔيغ اُؼِٔيبد‬
‫‪ ٝ‬اإلعزؼالٓبد اُز‪ ٠‬يو‪ ّٞ‬ث‪ٜ‬ب اُجشٗبٓظ ًِ‪ .ٚ‬كبُ‪ٞ‬ط‪ ٍٞ‬اُ‪ ٠‬اُجيبٗبد ػٖ ؿشين اُذخ‪ ٍٞ‬اُ‪ ٠‬اٌُي٘‪ٗٞ‬بد سثٔب‬
‫يوذّ أداء أكؼَ‪ ٌُٖ .‬ك‪ ٠‬اُغبٗت األخش ئرا ً٘ذ رؾظَ ػِ‪ٗ ٠‬زيغخ اإلعزؼالّ ثبعزخذاّ أٗ‪ٞ‬اع ٓغ‪ُٜٞ‬خ‬
‫(‪ٝ )Anonymous types‬ال رو‪ ّٞ‬ثبُؼَٔ ػِ‪ ٠‬اٌُي٘‪ٗٞ‬بد ك‪ ٠‬اُزاًشح‪ ,‬كشثٔب رلؼَ إٔ رؼَٔ ثـشم رؼزٔذ‬
‫ػِ‪ ٠‬اإلعزؼالٓبد‪ ....‬ث٘بءاَ ػِ‪ ٠‬رِي اُؾبالد اُغبثوخ ئٌ٘٘ب إٔ ٗو‪ ٍٞ‬ئٕ اُـشيوخ األٓضَ ُِذخ‪ ٍٞ‬اُ‪ ٠‬اُجيبٗبد‬
‫" يؼزٔذ ػِ‪." ٠‬‬

‫اإلستؼالياث انًباشرة (‪)Direct Queries‬‬


‫ك‪ ٠‬ثؼغ األؽيبٕ هذ رؾزبط اُ‪ ٠‬اعزخذاّ ثؼغ ٓيضاد ‪ SQL‬اُـيش ٓ‪ٞ‬ع‪ٞ‬دح ك‪ .LINQ ٠‬ػِ‪ ٠‬عجيَ أُضبٍ‬
‫ٓوذ رؾزبط اُ‪ ٠‬اعزخذاّ ٓيضح )‪ Common Table Expressions (CTE‬أ‪ ٝ‬اعزخذاّ أٓش ‪ .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‬‬
‫‪Read-Only DataContext Access‬‬
‫ئرا ً٘ذ رشؿت ك‪ ٠‬اُذخ‪ ٍٞ‬اُ‪ ٠‬اُجيبٗبد ُِوشاءح كوؾ ثذ‪ ٕٝ‬ئٌٓبٗيبد اُزؼذيَ كي‪ٜ‬ب‪ ,‬كيغت ػِيي إٔ رو‪ّٞ‬‬
‫ثايوبف اُخذٓخ اُز‪ ٠‬رذػْ رؼذيَ اُجيبٗبد ‪ٝ‬اُز‪ ٠‬ر‪ٞ‬عذ ثذاخَ اُـ ‪.DataContext‬‬
‫;) ‪DataContext db = new DataContext( ConnectionString‬‬
‫;‪Db.ObjectTracjing = false‬‬

‫تذذيث انبياَاث (‪)Data Update‬‬


‫‪٘ٛ‬بى خذٓخ ( ‪ )Service‬ثذاخَ ‪ LINQ To SQL‬رغٔ‪ ٠ٛٝ ,identity management ٠‬رو‪ ّٞ‬ثزؼوت‬
‫اٌُي٘‪ٗٞ‬بد اُز‪ ٠‬رزؼبَٓ ٓؼ‪ٜ‬ب‪ٛ ,‬ز‪ ٙ‬اُخذٓخ ٓؼٔ‪ٗٞ‬خ كوؾ ٌُِي٘‪ٗٞ‬بد اُز‪ ٠‬رأر‪ ٠‬ػٖ ؿشين ‪.DataContext‬‬
‫ك‪ ٠ٜ‬رؼغ ًَ طق ٓ‪ٞ‬ع‪ٞ‬د ك‪ ٠‬اٌُي٘‪ٗٞ‬خ ك‪ ٠‬اُزاًشح ‪.‬‬

‫تذذيث انكيَُٕاث‬
‫‪٘ٛ‬بى خذٓخ ك‪ LINQ ٠‬رغٔ‪ Change tracking ٠‬ا‪ ٟ‬رزجغ اُزـيشاد‪ .‬رِي اُخذٓخ ٓغإُخ ػٖ رـيشاد‬
‫اُجيبٗبد اُز‪ ٠‬رؾذس ك‪ ٠‬اٌُي٘‪ٗٞ‬بد‪ .‬ؽيش رؾزلظ رِي اُخذٓخ ثبُويْ األطِيخ ُِجيبٗبد ‪ ٝ‬ايؼبً اُويْ اُغذيذح‪,‬‬
‫‪ٝ‬رو‪ ّٞ‬ثز‪ُٞ‬يذ اعزؼالّ ‪ُ SQL‬زؾذيش اُجيبٗبد ك‪ ٠‬هبػذح اُجيبٗبد ٗلغ‪ٜ‬ب‪ٝ .‬ئٌ٘ي إ رش‪ًٞ ٟ‬د ‪ SQL‬اُز‪ُٝ ٟ‬ذر‪ٚ‬‬
‫رِي اُخذٓخ ػٖ ؿشين اعزخذاّ داُخ ‪.GetChangeText‬‬
‫;) "‪var customer = db.Customers.Single( c => c.CustomerID == "FRANS‬‬
‫;"‪customer.ContactName = "Marco Russo‬‬
‫;) )(‪Console.WriteLine( db.GetChangeText‬‬

‫‪ Contact Name‬اُ‪ Marco Russo ٠‬ػ٘ذ اُؼ٘ظش اُز‪ ٟ‬يٌ‪ٕٞ‬‬ ‫اٌُ‪ٞ‬د اُغبثن هبّ ثزـيش هئخ‬
‫‪ CustomerID‬كي‪ ٚ‬يغب‪ًٞ .FRANS ٟٝ‬د ‪ SQL‬اُز‪ ٟ‬يزْ ر‪ُٞ‬يذ‪ٛ ٖٓ ٙ‬زا اٌُ‪ٞ‬د ًبُزبُ‪:٠‬‬
‫]‪UPDATE [Customers‬‬
‫'‪SET [ContactName] = 'Marco Russo‬‬
‫]‪FROME [Customers‬‬
‫‪WHERE ...‬‬

‫رزًش عيذاً إٔ رُي ً‪ٞ‬د ‪ SQL‬رْ ر‪ُٞ‬يذ‪ ٙ‬كوؾ‪ ,‬ا‪ ٟ‬اٗ‪ ُْ ٚ‬يشعَ ثؼذ اُ‪ ٠‬هبػذح اُجيبٗبد‪ .‬ك‪ ُٖ ٜٞ‬يشعَ ئال ثؼذ‬
‫اعزذػبء داُخ ‪.SubmitChanges‬‬

‫آب ئرا اسدد إٔ رؼيق عغَ ُِغذ‪ ٍٝ‬أ‪ ٝ‬رؾزف عغَ ٖٓ اُغذ‪ ,ٍٝ‬كإ ئٗشبء اُغغَ ‪ٝ ٝ‬ػؼ‪ ٚ‬ك‪ ٠‬اُزاًشح‬
‫ُيظ ًبكيبً‪ .‬كيغت ثؼذ ئٗشبء اُغغَ ك‪ ٠‬اُزاًشح إٔ ٗؼيل‪ ٚ‬اُ‪ ٠‬هبػذح اُجيبٗبد‪ .‬اُ٘ظش اٌُ‪ٞ‬د اُزبُ‪:٠‬‬

‫‪49‬‬
var NewCustomer = new customer {
CustomerID = "DLEAP",
CompanyName = "DevLeap",
Country = "Italy" };
db.Customers.Add( newCustomer );

var oldCustomer = db.Customers.Single( c => c.CustomerID == "FRANS" );


db.Customer.Remove( oldCustomer );

ٙ‫ اػـي٘ب‬ٝ newCustomer ٙ‫ اعٔي٘ب‬ٝ customer ٖ‫ عغَ ٖٓ اٌُبئ‬ٝ‫ػبػ هٔ٘ب ثؼَٔ ٗغخخ أ‬ٝ ٞٛ ‫ًٔب‬
ٟ‫ صْ هٔ٘ب ثبُجؾش ػٖ اُغغَ اُز‬.ٍٝ‫ اُغذ‬٠‫ إلػبكخ اُغغَ ك‬Add ‫ صْ ثؼذ رُي اعزخذٓ٘ب داُخ‬.‫اُويْ أُ٘بعجخ‬
‫عذ‬ٞ‫ ال ي‬...ٍٝ‫ ٖٓ اُغذ‬ٚ‫ هٔ٘ب ثٔغؾ‬Remove ‫ صْ ثبعزخذاّ داُخ‬.FRANS ٟٝ‫ رغب‬ٚ‫ كي‬CustomerID ‫هئخ‬
:‫اُيظ‬ٌُٞ‫ خِق ا‬ٙ‫ُيذ‬ٞ‫ يزْ ر‬ٟ‫ اُز‬SQL ‫د‬ًٞ ٠ُ‫ اٗظش ا‬...‫َ ٖٓ رُي‬ٜ‫أع‬
INSERT INTO [Customers](CustomerID, CompanyName, ...)
VALUES("DEVLEAP", "DevLeap", ...)

UPDATE [Orders]
SET [CustomerID] = NULL
FROM [Orders]
WHERE ([OrderID] = @p1) AND ...

DELETE FROM [Customers] WHERE [CustomerID] = "FRANS"

ً‫ اكزشػ٘ب كشػب‬ُٞٝ ...‫د‬ٌُٞ‫زا ا‬ٛ ‫ اٗي ال رؾزبط ُششػ‬ٟ‫ ا‬...ٚ‫ رذسى ٓؼبٗي‬ٝ ً‫ عيذا‬SQL ‫د‬ًٞ ‫أػزوذ اٗي رؼشف‬
.‫ كوؾ‬ٚ‫٘ب ُؼشػ‬ٛ ‫د‬ٌُٞ‫ػؼ٘ب ا‬ٝ ‫ ُوذ‬,‫زا يظيجي ثبُوِن‬ٛ ‫ كال رذع‬,ٚ‫خيبُيبً اٗي ال رذسى ٓؼبٗي‬

‫ أُضبٍ االعجن‬٠‫ ك‬RemoveAll ٝ‫ ا‬Remove ّ‫ٍ ئٌٖ اعزخذا‬ٝ‫ص ؽزف اُغغالد ٖٓ اُغذا‬ٞ‫ثخظ‬
.RemoveAll َٔ‫ف ٗغزؼ‬ٞ‫ ع‬٠ُ‫ أُضبٍ اُزب‬٠‫ ك‬ٝ Remove ‫اعزؼِٔ٘ب‬
var order = db.Orders.Single( o => o.OrderID == 10248 );
db.Order_Details.RemoveAll( order.Order_Details );
db.Order.Remove( Order );
db.SubmitChanges()

‫تذذيث لٕاػذ انبياَاث‬


‫ هبػذح اُجيبٗبد ثـشيوخ‬٠ُ‫ب ا‬ُٜ‫ اسعب‬ٝ ‫ب‬ٛ‫ُيذ‬ٞ‫ يزْ ر‬SQL َٔ‫ كإ اُؼذيذ ٖٓ ع‬,LINQ To SQL ّ‫ػ٘ذ اعزخذا‬
‫ اُوبػذح‬٠‫ّ ثزؼذيَ ؽبُخ اُجيبٗبد ك‬ٞ‫ رو‬٠‫ اُز‬SQL ‫آش‬ٝ‫ اُغبٗت األخش كإ ا‬٠ِ‫ ػ‬.ّ‫ؿيش ٓشئيخ ثبُ٘غجخ ُِٔغزخذ‬
٠‫دح ك‬ٞ‫ع‬ُٞٔ‫ ا‬SubmitChanges ‫ اُوبػذح ػ٘ب روشس اٗذ رُي ػٖ ؿشين اعزخذاّ داُخ‬٠ُ‫رشعَ ا‬
: ٠ُ‫د اُزب‬ٌُٞ‫ ا‬٠‫ػؼ ك‬ٞٓ ٞٛ ‫ ًٔب‬.DataContext
Northwind db = new Northwind( Program.ConnictionString );
var customer = db.Customers.Single( c => c.CustomerID == "FRANS";
customer.ContactName = "Marco Russo";
db.SubmitChanges();

50
‫انؼًهياث انًتزايُت (‪)Concurrent Operations‬‬
‫رو‪ LINQ ّٞ‬ثزخضيٖ اٌُي٘‪ٗٞ‬بد اُز‪ ٠‬رزؼبَٓ ٓؼ‪ٜ‬ب ك‪ ٠‬اُزاًشح‪ .‬أ‪ ٟ‬اٗ‪ٜ‬ب رؼَٔ ث٘ظبّ ‪ .Disconnected‬ك‪ٛ ٠‬ز‪ٙ‬‬
‫اُؾبُخ‪ ,‬ؿبُجبً ٓب يؾذس إٔ يو‪ ّٞ‬أًضش ٖٓ ٓغزخذّ ثاعشاء ػِٔيبد ٓزضآ٘خ ك‪ٝ ٠‬هذ ‪ٝ‬اؽذ‪ٝ .‬هذ يزغجت ‪ٛ‬زا‬
‫اُزضآٖ ك‪ ٠‬ئعشاء اُؼِٔيبد ك‪ ٠‬ؽذ‪ٝ‬س رؼبسع ثيٖ أُغزخذٓيٖ‪ .‬ك‪ ٠‬رِي اُؾبُخ يظذس أُزشعْ سعبُخ رليذ‬
‫ثإٔ ‪٘ٛ‬بى رؼبسع ك‪ ٠‬اُؼِٔيبد‪ٛ ,‬ز‪ ٙ‬اُشعبُخ رؾز‪ ٟٞ‬ػِ‪ ٠‬اُؼِٔيبد أُزؼبسػخ ‪ٝ‬عجت اُخـأ‪ٝ .‬يزْ ئيوبف‬
‫اُؼِٔيبد‪ .‬اٌُبئٖ أُغإٍ ػٖ ئطذاس رِي اُشعبُخ ‪ ٖٓٝ .ChangeConflictExeption ٞٛ‬خالٍ دساعزي‬
‫ُِـخ ‪ C#‬رؼشع ُذساعخ اُـ ‪ .Exeptions‬اٗظش اٌُ‪ٞ‬د اُزبُ‪:٠‬‬
‫;) ‪Northwind db2 = new Northwind( Program.ConnictionString‬‬
‫) ‪for ( int retry = 0; retry < 4; retry++‬‬
‫{‬
‫;) "‪var customer2 = db2.Customers.Single( c => c.CustomerID =="FRANS‬‬
‫;"‪customer2.ContactName = "Paolo Pialorsi‬‬
‫‪try‬‬
‫{‬
‫;)(‪Db2.SubmitChanges‬‬
‫;‪Break‬‬
‫}‬
‫)‪Catch ( ChangeConflictExeption ex‬‬
‫{‬
‫;) ‪Console.WriteLine( ex.Message‬‬
‫;) ‪Db2.Refresh( customer2, RefreshMode.KeepChanges‬‬
‫}‬
‫}‬

‫‪ٛ‬زا اٌُ‪ٞ‬د يو‪ ّٞ‬ثاػبدح ٓؾب‪ُٝ‬خ رؾذيش اُجيبٗبد ؽز‪ ٠‬اسثغ ٓؾب‪ٝ‬الد‪ ,‬ئرا ‪ٝ‬عذ أ‪ ٟ‬رؼبسع ػ٘ذ اُز٘ليز‪ٝ .‬ئرا رْ‬
‫اُز٘ليز ثبُلؼَ رز‪ٞ‬هق أُؾب‪ٝ‬الد‪ ٝ .‬ئٕ ‪ٝ‬عذ أ‪ ٟ‬رؼبسع‪ ,‬كاٗ‪ ٚ‬يظذس سعبُخ ثٔؼِ‪ٓٞ‬بد ‪ٛ‬زا اُزؼبسع‪.‬‬

‫‪ SubmitChanges‬ئٌٖ إٔ‬ ‫ؿشيوخ أخش‪ ٟ‬إلػبدح ٓؾب‪ُٝ‬خ رؾذيش اُجيبٗبد ئرا ؽذس أ‪ ٟ‬رؼبسع‪ ,‬كذاُخ‬
‫رؾز‪ ٟٞ‬ػِ‪ ٠‬ػ٘بطش ُزؾذيذ ئرا ٓب ً٘ذ رشيذ ايوبف اُز٘ليز أ‪ ٝ‬ئػبدح أُؾب‪ُٝ‬خ‪ ٌُٖ .‬ئٕ ُْ رؾذد ُ‪ٜ‬ب ا‪ ٟ‬ش‪٠‬ء‬
‫كإ اُزظشف اإلكزشاػ‪ُٜ ٠‬ب ‪ ٞٛ‬إٔ رز‪ٞ‬هق ػٖ اُز٘ليز ك‪ ٠‬ؽبُخ اُزؼبسع‪.‬‬
‫;)‪Db.SubmitChanges(ConflictMode.FailOnFirstConflict‬‬
‫;)‪Db.SubmitChanges(ConflictMode.ContinueOnConflict‬‬

‫األٕ‪ٝ ,‬األٕ كوؾ أطجؾذ ٓإ‪ٛ‬الً ُِجذأ ك‪ ٠‬اعزخذاّ ‪ .LINQ‬رِي اُزو٘يخ اُز‪ ٠‬ع‪ٞ‬ف رظجؼ ٖٓ اُي‪ ّٞ‬أ‪ ْٛ‬عضء‬
‫ك‪ ٠‬ثشآغي‪ .‬ع‪ٞ‬اء ً٘ذ رؼَٔ ػِ‪ ٠‬ه‪ٞ‬اػذ ثيبٗبد أ‪ ٝ‬رؼَٔ ػِ‪ ٠‬ا‪ ٟ‬ش‪٠‬ء أخش‪.‬‬

‫تى بذًذ اهلل‬


‫‪11 - 1 - 2008‬‬

‫‪51‬‬
‫انًراجغ‬
 Introducing Microsoft LINQ, Microsoft Press, 2007
 LINQ - the future of data access in C# 3.0, O'Reilly Press, 2006
 msdn2.microsoft.com
 www.davidhayden.com

52

You might also like