Professional Documents
Culture Documents
Start LINQ ابدأ
Start LINQ ابدأ
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("\n");
}
Console.WriteLine("\n");
}
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
}
انكٕد انسابك نيس صذيذاً يٍ انُاديت انهغٕيت ( انخاصت بهغت انبريجت) ,نكُّ يشرح انًؼُى نيس أكثر.
;)"Console.WriteLine("\n
}
الؽظ ئػبكخ > <Tثؼذ أعْ اُذاُخ ٓجبششح ,صْ اعزخذاّ ؽشف (ُِ )Tزؼجيش ػٖ اُ٘ٞع ثذاخَ اُذاُخ .ؿجؼبً ئٌ٘٘ب
ًزبثخ أ ٟسٓض أخش ٟؿيش اُـ ٌُ٘ ,Tي عٞف رؼزبد ػِ ٠سؤيخ ٛزا اُؾشف ًضيشاً ك ٠اُؼذيذ ٖٓ اٌُزت اُزو٘يخ,
ٝٝعبئَ أُغبػذح أُخزِلخُ .زُي ي٘ظؼ ثبعزخذاّ ٛزا اُؾشف.
صْ ثؼذ رُي ئٌ٘ي اعزذػبء رِي اُذاُخ ثؼذح اٗٞاع ٓخزِلخ ٖٓ اُؼ٘بطش:
;) PrintArray( intArray
;) PrintArray( doubleArray
;) printArray( charArray
كٛ ٠ز ٙاُؾبُخ يو ّٞأُزشعْ ( )Compilerثبعز٘زبط ٗٞع اُجيبٗبد اُز ٠اػـيذ ُِذاُخ ,صْ ر٘ليز اُذاُخ ثؾيش
رز٘بعت ٓغ اُ٘ٞع أُُذخَ اُيٜب.
Delegates
كِ٘لزشع إ ٘ٛبى داُخ كًٞ ٠د يزْ ًزبثز ,ٚرِي اُذاُخ عٞف رغزذػ ٠كٌٓ ٠بٕ ٓؾذد ك ٠اٌُٞدٝ .اُذٝاٍ
رغزذػ ٠ثإٔ يٌزت اعٜٔب ك ٠أٌُبٕ اُزٗ ٟشيذ .ٙصْ ثؼذ رُي ٗو ّٞثزشـيَ اٌُٞد أ ٝرشعٔز ٖٓ ٚهجَ أُزشعْ,
ٓ ًَٝشح يزْ رشـيَ كيٜب اٌُٞد يزْ اعزذػبء اُذاُخ ػ٘ذ ٗلظ اُ٘وـخ أ ٝأٌُبٕ اُزً ٟزج٘ب اعٜٔب كيٓ ٌُٖ .ٚبرا
ُ ٞؽذس ً ٝبٕ ػ٘ذٗب ػذح دٝاٍ ٗ ٝشيذ إٔ ٗغزذػ ٠داُخ ٝاؽذح كوؾ ٝكوبً ُؾذس ٓؼيٖ٘ٛ .بى اُؼذيذ ٖٓ
,IFأ ٝعِٔخ ٘ٛ ٌُٖ .Switchبى ؽَ أكؼَ ٞٛ ٝاعزخذاّ اُـشم ,كٖٔ أٌُٖٔ إ ٗغزخذّ عِٔخ
.Delegate
8
يؼزجش اُـ ٞٛ Delegateاُـشين اُز ٟرؼَٔ ث ٚاألؽذاس .اُـ Delegateيؼزجش ٓإشش ُِذٝاٍ ( .)Pointer
ك ٜٞيو ّٞثزٔشيش أُشعغ اُخبص ثبُذٌٓ ( ٍٝبٕ اُذاُخ ك ٠اُزاًشح) ٝرشـيَ رِي اُذٝاٍ ثذ ٕٝاعزذػبءٛب
طشاؽخً.
ؽيش :
ٓ : access-modifierؼشف اُذخ ٍٞاُ ٠اٌُبئٖ ( ُٔضيذ ٖٓ أُؼِٓٞبد اسعغ اُ ٠اعبعيبد ُـخ )C#
ٞٗ :Result-typeع اُجيبٗبد اُز ٠ي٘زغٜب اُـ ٝ Delegateاُز ٠رزـبثن ٓغ اُذاُخ اُز ٠يشيش اُيٜب
ك ٠أُضبٍ اُغبثن ,هٔ٘ب ثبُزظشيؼ ػٖ Delegateاعٔ ٝ myDelgegate ٚاُز ٟئٌٖ إٔ ٗغزخذُٓ ٚزشـيَ
ا ٟداُخ رؼٞد ثوئخ ٖٓ اُ٘ٞع ٝ intرأخز ػ٘ظش ٝاؽذ ٖٓ اُ٘ٞع ٝ .Doubleإلعزخذاّ ٛزا اُـ ,Delegate
الثذ ٖٓ ػَٔ ٗغخخ عذيذح ٓ٘ ٚرؾز ٟٞػِ ٠اعْ اُذاُخ اُزٗ ٠شيذ رشـيِٜبً .بُزبُ:٠
)public int ReturnInt( double D
{
جسن الدالت //
}
ك ٠ثذايخ اٌُٞد هٔ٘ب ثاٗشبء داُخ اعٜٔب ٞٗٝ ReturnIntػٜب ٝ intرأخز اُؼ٘بطش ٖٓ ٞٛ ٝ Dاُ٘ٞع .Duble
ٝ myDelegateاػـيٜ٘ب األعْ aDelegateصْ ؽذدٗب ُـ صْ ك ٠داُخ أخش ٟهٔ٘ب ثٔؼَ ٗغخخ ٖٓ
aDelegateاُذاُخ ٠ً ReturnIntيو ّٞثزشـيِٜب.
9
ثؼذ ًَ ٛزا ,ثبهُ٘ ٠ب كوؾ إ ٗو ّٞثزٔشيش هئخ ُِـ ٠ً Delegateيو ّٞثزشـيَ اُذاُخ ثٜب:
;)aDelegate(12345
ك ٠اٌُٞد اُغبثن هٔ٘ب ثزؼشيق 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بئٖ يوّٞ اُؼذيذ ٖٓ اُـشم اُز ٠رإد ٟاُ ٠رُي ٌُٖ .أثغؾ ؿشيوخ ٠ٛػَٔ
ثبُذخ ٍٞاُ ٠آ ٟغٔٞػخ ٖٓ اُؼ٘بطش ).
11
Class TestDaysOfWeek
{
Static void Main()
{
DayesOfWeek week = new DayesOfWeek();
Foreach ( string day in week )
{
Console.Write(day+ " ");
}
٠ رذػ٠ اُزinterface ّ ثزـجين اُـٞ رو٠اُزٝ DaysOfWeek ٠ٔد هٔ٘ب ثاٗشبء كئخ رغٌُٞزا اٛ ٠ك
٠ِ ػinterface ثزـجين رِي اُـ.) Interfaces ْ اُـٜ ٓشعغ ُلٟ أ٠ُدح اٞ اُؼ٠ ( يشع.IEnumerable
ٕ كاyield ئرا ًبٕ ثذاخَ رِي اُذاُخ ًِٔخ.GetEnumerator() ٠ٔ اُلئخ داُخ رغٟ أطجؼ ُذ,رِي اُلئخ
٠ رذػ٠ اُزinterface ّ ثزـجين اُـُٞيذ كئخ عذيذح روّٞ ثزٞيوٝ iterator بٜٗ ئ٠ِأُزشعْ يؾذد رِي اُذاُخ ػ
ٝ MoveNext ٔبٛ ٝ interface ب رِي اُـٜيٞ رؾز٠اٍ اُزُٝيذ اُذّٞ ثزٞايؼبً يوٝ IEnumerator
ب ر٘ليز داُخٜ ًَ ٓشح يزْ كي٠ ك.iterator ثبعزخذاّ اُـLoop َٔ صْ ثؼذ رُي هٔ٘ب ثؼ.Dispose
ْسح اُضبٗيخ يزٝ اُذ٠ صْ ك.هقٞاؽذح صْ يزٝ yield يزْ ر٘ليز عِٔخiterator دح ثذاخَ اُـٞعُٞٔ اMoveNext
.ًبئيبٜٗ هقٞب يزٛػ٘ذٝ yield break عِٔخ٠ُ يظَ ا٠ٌزا ؽزٛٝ هقٞر٘ليز اُغِٔخ اُضبٗيخ صْ يز
.بُٛيذّٞ أُزشعْ ثزٞ يو٠ ٖٓ اُلئخ اُزmyEnumerator ٖ٘ب هٔ٘ب ثبشزوبم اٌُبئٛ
myEnumerator.MoveNext()
ٚس كيٝ يذٟ أُغبٍ اُز٠ٜ اٗزٝ أyield break عذ أُزشعْ عِٔخٝ ئرا.yield ٍ عِٔخٝ٘ب يزْ ايغبد أٛ
.while عِٔخ٠ٜر٘زٝ false ثبُوئخMoveNext د داُخٞف رؼٞكغ
myEnumerator.Current
12
ييزاث C# 3.0
اإلطذاس C# 3.0ؽشى ُـخ C#ك ٠ئرغب ٙاُِـخ اُٞظيليخٝ .رُي ثزوذيْ أعِٞة أًضش رظشيؾبً ٝ .رغزخذّ
LINQعٔيغ أُيضاد اُغذيذح ك C# 3.0 ٠روشيجبً ٝ ,رِي أُٔيضاد رغؼِ٘ب هبدسيٖ ػًِ ٠زبثخ ًٞد أًضش
ثغبؿخ ٝٝػٞػ.
روذّ ٓ 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 ال جيوز تعريف هتغري جمهول ىف جسن الفئت هببشرة //
ك ٠اٌُٞد اُغبثن ,أُلزشع ئٕ أُزشعْ يغزـيغ اعز٘زبط ٗٞع أُزـيش ٝ Kرُي ٖٓ خالٍ اُوئخ أُجذئيخ
ُِٔزـيشٛ ٌُٖ .زا ؿيش ٓغٔٞػ ث ٚكٛ ٠زا أٌُبٕ ٖٓ اٌُٞد .ايؼبً اُذاُخ ٖٓ InvalidUseResultأٌُٖٔ
اعز٘زبط ٗٞع اُ٘زيغخ اُز ٠رؼٞد ثٜبٛ ٌُٖ ,زا ؿيش ٓغٔٞػ ث ,ٚكالثذ ٖٓ رؾذيذ ٗٞع اُذُخ ٖٓ هجَ أُجشٓظ.
اٌُٞد اُزبُ ٠ػجبسح ثشٗبٓظ ثغيؾ ,هٔ٘ب ثاٗشبء 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 ُوذ هٔ٘ب ثبُـبء اُذاُخ
َٕٔ ػٝد ٓجبششح دٌُٞ هٔ٘ب ثٌزبثخ ا, ٌٓبٕ أخش٠ب كٜ ٌٓبٕ صْ اعزذػبئ٠ اٗ٘ب ثذالً ٖٓ ػَٔ داُخ كٟ أ.ٍٝاأل
.رِي اُذاُخ
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 ؽيش
: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
.ٚف رؼبف اُيٞ عٟاٌُبئٖ اُز
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" },
;}
كٛ ٠زا اٌُٞد هٔ٘ب ثاٗشبء كئخ رؾز ٟٞػِ ٠خبطيزيٖ ٝ ,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;
األعـشٞٛ دٌُٞزا اٛ ٠ٔ٘ب كٜ ٓب ي.ٍ ال ػِيي ٓغشد عإا..؟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اُز ٟيؾذد اُششٝؽ اُٞاعت رٞاكشٛب ك ٠اُجيبٗبد اُز ٠عٞف ٗغزؼِْ ػٜ٘ب .ا ٟاٗ ٚيوّٞ
ثؼِٔيخ كِزشح ُِجيبٗبد أُٞعٞدح ٝايغبد اُجيبٗبد راد أُٞاطلبد أُؾذدح ُ.ٚ
الؽظ إٔ ٌٓ 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 /
Let id = expr |
Where condition |
Select expr |
[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
Let id = expr
Where condition
whereثؼَٔ كِزش ُِجيبٗبد ٝرُي ؽيش ٞٛ conditionاُششؽ أٓ ٝغٔٞػخ اُششٝؽ .ؽيش رو ّٞػجبسح
ثبُجؾش ػٖ ثيبٗبد ُٜب ششٝؽ ٓؾذدح.
٠ٛٝرو ّٞثزشريت ػشع اُجيبٗبد ئٓب ر٘بصُيبً أ ٝرظبػذيبً .ػِ ٠ؽغت هئخ ؽوَ أ ٝاًضش ٖٓ ؽوَ.
into id query
ٝػغ اُ٘زيغخ كٌٓ ٠بٕ ٓإهذ ُإلعزؼالّ ٜٓ٘ب .ش٠ء ٓب ٓشبثُ ٚؼِٔيخ اإلعزؼالٓبد اُلشػيخ.
ٓب عجن ػجبسح ػٖ ٓشعغ عٞف ٗشعغ اُي ٚػ٘ذ اُؾبعخ اًُ ٠زبثخ اعزؼالّٝ .عٞف ٗل ًَ ْٜش٠ء ػٖ رِي
اُؼجبساد اص٘بء اُششػ ....ال روِن ك٘ؾٖ ُْ ٗجذأ ششػ ثؼذ .
25
Query Operators
ف رغجت ثؼغ اإلسرجبى كٌِٔخٞب اُؾشكيخ عٜ ألٕ رشعٔز,Operators ٠ّ٘ ثزشعٔخ ٓؼٞ أُشح ُٖ أهٙزٛ
.Operator ٠ٛ ب ًٔبٛ ٌُ٘٘ب ٗشيذ.َٓ اُؼبٝ أُشـَ ا٠٘ رؼOperator
LINQ ضح ٓغٛ عب٠اٍ رأرٝ ػجبسح ػٖ د٠ٜ ك.بٜػبً ػٖ رشعٔزٞ ػOperators ٖٓ دٞئٌ٘٘ب ششػ أُوظ
اعزخذّ رِي٠ِ ئٕ اإلعزؼالّ يظجؼ هبدس ػٟ ا.ّٚ ثاٗشبئٞ اعزؼالّ روٟ ا٠ُب اٜاٍ يزْ رخظيظٝ رِي اُذٝ
. اُخبطخٚ ػِٔيبر٠اٍ كٝاُذ
فٞ اُظل٠ صْ هٔذ ثؼشة األػٔذح ك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
Any
يوٛ ّٞزا اُـ operatorثلؾض ٓظذس اُجيبٗبد ٝاُجؾش ػٖ ا ٟػ٘ظش يؾون ثؼغ اُششٝؽ أُـِٞثخ.
كِ٘لزشع اٗي رشيذ ٓؼشكخ ٘ٛ َٛبى أ Doctor ٟيؼيش كٓ ٠ذي٘خ اُوبٛشح:
;)(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 ًٕ اُ٘برظ ٓضالٌٞيٝ ػذد أيبّ اُغ٘خٞٛٝ
ٌٕٞ رavg2 أُزـيشٝ .بٛ ػذد٠ِٓخ ػٞ ٓوغints ْع هيٞٔ ٓغٞٛٝ 3.5 ٟٝ رغبٚ هئزavg1 ثبُ٘غجخ ُِٔزـيش
آب أُزـيش.ْ هي4 ٘بٛ ٠ٛٝ بٛ ػذد٠ِٓخ ػٞ ٓوغvalues ٠ع اُويْ اُـيش كبسؿخ كٞٔ ٓغٞٛٝ 2.5 ٚهئز
.); ٚعـٞ يؾغت ُ٘ب ٓز٠ً ك٘ؾٖ ُْ ٗؾذد اعزؼالّ ٓؾذد, ئال اهللٚ كال يؼِْ هئزavg
Cast
.ع ٓؾذدٞٗ ٠ُاع اُؼ٘بطش اٞٗيَ أّٞ يزؾٞيو
ArrayList al = new ArrayList();
al.Add("abc");
al.Add("def");
al.Add("ghi");
.string عُٞ٘ ا٠ُب اِٜيٞ رْ رؾArrayList عُٞ٘ػخ ٖٓ اُؼ٘بطش ٖٓ اٞٔد اُغبثن ٓغٌُٞا
Concat
.اؽذٝ ) ػ٘ظشيٖ ثجؼغ كيظجؾب ػ٘ظشConcatenate( ّ ثشثؾٞيو
int[] ints1 = { 1, 2, 3 };
int[] iints2 = { 4, 5, 6 };
28
var query2 = from ...;
ّ هب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 ...;
29
count1 = 6, count2 = 5, count3 = 12, count4 = 5
DefualtIfEmpty
ػغ اُوئخ اإلكزشاػيخٝ ْئرا ُْ رؾذد رِي اُوئخ كيزٝ ,ػغ هئخ اكزشاػيخٝ ْ٘بى ػ٘ظش كبسؿبً كيزٛ ٕئرا ًب
:ع ثيبٗبد اُؼ٘ظشٞ٘اُخبطخ ث
int[] ints1 = {1, 2, 3, 4, 5, 6 };
int[] ints2 = { };
var query = from ...;
ٚ كزظجؼ هئزZero آب أُزـيش.ً ُيظ كبسؿبٚٗرُي ألٝ ints1 ٗلظ هئخ أُزـيشٚ رظجؼ هئزints أُزـيش
minus1 اُؼ٘ظشٝ . طلش٠ٛ intٍ اُوئخ اإلكزشاػيخٝ int عُٞ٘ ٖٓ اٞٛٝ ً كبسؿبints2 ألٕ أُزـيش0
.-1 ٠ٛٝ ًُهٔ٘ب ثزؾذيذ هئخ ئكزشاػيخ ئرا ًبٕ كبسؿبٝ َ كشاؽints2 رُي ألٕ اُؼ٘ظشٝ -1 ٚرظجؼ هئز
Distinct
: رٌشاسادٟٕ اّٝ ثاسعبع اُ٘زبئظ ثذٞيو
int[] ints = { 1, 2, 2, 3, 2, 3, 4 };
var query = from ...;
. رْ ؽزف ًَ اُؼ٘بطش أُزٌشسحٚٗ اٟ) ا1, 2, 3, 4 ( ٟٝ رغبdistinctInts د رظجؼ هئخٌُٞثؼذ ر٘ليز ا
ElementAt
: اُضبُضخٝ ٓضالً اُوئخ اُضبٗيخ أ. سرجخ ٓؾذدح٠دح كٞعُّٞٔ ثاسعبع اُوئخ اٞيو
int[] ints = { 1, 2, 3, 4, 5, 6 };
Doctors doctors = new Doctors();
var query = from …;
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);
سرجخ عبدعخٚعذ ثٞ ال ي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);
First
.ػخ ؿيش كبسؿخٕٞٔ رِي أُغٌٞ ثششؽ إٔ ر,ػخ ػ٘بطشٞٔ ٓغ٠ٍ هئخ كّٝ ثبعزشعبع أٞيو
int[] ints = { 1, 2, 3, 4, 5, 6 };
Doctors doctors = new Doctors();
var query = from ...;
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();
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 };
Join
.SQL ٠ كinner join ب ٓضَ ػجبسحِٜ ٓض.ػزيٖ ٓؼبً ٖٓ خالٍ ٓلزبػٞٔسثؾ ٓغ
DataSets.SchedulingDocs ds = FillDataSet();
Last
.ػخٞٔ أُغ٠ّ ثبعزشعبع أخش ػ٘ظش كٞيو
int[] ints = { 1, 2, 3, 4, 5, 6 };
int last = ints.Last();
34
LastOrDefault
.ب هيْ كبسؿخٜٕ ثٌٞػخ يؾزَٔ إ يّٞٔ ثبعزشعبع أخش ػ٘ظش ٖٓ ٓغٞيو
int[] ints1 = { 1, 2, 3, 4, 5, 6 };
int[] ints2 = { };
int x1 = ints1.LastOrDefault();
int x2 = ints2.LastOrDefault();
LongCount
Long عُٞ٘ ٓزـيش ٖٓ ا٠اعزشعبع اُ٘برظ كٝ ػخ ٓؾذدحّٞٔ ثؼذ ػ٘بطش ٓغٞرو
int[] ints = { 1, 2, 3, 4, 5, 6 };
decimal?[] values = { 1, null, 2, null, 3 };
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();
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
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
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 ...;
هئخٟ اُؼ٘ظش اُزٞٛٝ 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 )
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
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> ٖ ًبئ٠ب كٜ٘ رخضيٝ اعزشعبع اُجيبٗبد
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
اُٛ ٠زا اُؾذ سثٔب رشيذ إٔ رغأٍ ػذح اعئِخ .اٝالً ًيق ئٌٖ إلعزؼالّ LINQإ يٌزت ثبعزخذاّ اعْ اٌُبئٖ
ٝيزْ اُزؾون ٖٓ طؾز ٚثٞاعـخ أُزشعْ؟ ك ٠أُبػً ٠بٕ اُزؾون ٖٓ اإلعزؼالّ يزْ ػِ ٠يذ ٝ DBMS
ُيظ ٓزشعْ اُِـخ .صبٗيبً ٓز ٠يزْ رُٞيذ اعزؼالّ ٖٓ SQLاإلعزؼالّ اُزٌٗ ٟزج ٚثبعزخذاّ LINQ؟ .صبُضبً ٓز٠
يزْ ر٘ليز اعزؼالّ SQL؟ .ؽغ٘بً ٖٓ ؽوي ػِي٘ب إٔ ٗو ّٞثاعبثخ رِي األعئِخُٔ ٌُٖ .ؼشكخ اإلعبثبد يغت ػِيي
إٔ رلٓ ْٜب ٞٔٗ ٞٛرط اٌُي٘ٗٞخ ( ) Entity Modelاُخبص ثـ ً ٝ LINQ to SQLزُي يغت إٔ رلٓ ْٜب ٞٛ
اإلعزؼالّ أُإعَ ( .) Deferred Query
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
ك ٠اُجبديخ هٔ٘ب ثزؼشيق ٓزـيش ٖٓ اُ٘ٞع varا ٟاٗ ٚؿيش ٓؾذد اُ٘ٞع ( ٛٝ .)Anonymous Typeزا
أُزـيش يؼجش ػٖ ٗزيغخ ر٘ليز ئعزؼالّٛٝ .زا اإلعزؼالّ رلظيًِ ٚبُزبُ: ٠
أُزـيش 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>();
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);
َٔ ُؼ٠ال داػٝ Compiled Query ٠ٔ يغٟزا اُزٛ ّ ػذّ اعزخذا٠د أػزوذ اٗي رلٌش كٌُٞزا اٛ ثؼذ سؤيخ
ِٖد عيذاً كٌُٞٔذ اٜ ٌُٖ ئٕ ك.ٌِٚثخ شٞد ُيظ ثظؼٌُٞ اُؾويوخ ا٠ ٌُٖ ك.ء٠ شٟ ألOptimization ٟا
ة ٓ٘يِٞ أُـ.Compiled Query ٟٞ ثشآغي ع٠ ثَ ثبُؼٌظ هذ ال رغزخذّ كِٚٔ ػ٠ثخ كٞ طؼٟرغذ ا
.بٜ٘ رزؾذس ػ٠٘بى اُؼذيذ ٖٓ اٌُزت اُزٛ ٝ .بٜ ؿشأد ػِي٠ اُزؾغي٘بد اُغذيذح اُزٝ C# ٓؼشكخ ُـخٞٛ كوؾ
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
ًٔب ٓ ٞٛالؽظ اٗ٘ب اعزخذٓب ُ 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ال رو ّٞثبُؼَٔ ػِ ٠اٌُي٘ٗٞبد ك ٠اُزاًشح ,كشثٔب رلؼَ إٔ رؼَٔ ثـشم رؼزٔذ
ػِ ٠اإلعزؼالٓبد ....ث٘بءاَ ػِ ٠رِي اُؾبالد اُغبثوخ ئٌ٘٘ب إٔ ٗو ٍٞئٕ اُـشيوخ األٓضَ ُِذخ ٍٞاُ ٠اُجيبٗبد
" يؼزٔذ ػِ." ٠
UNION ALL
48
Read-Only DataContext Access
ئرا ً٘ذ رشؿت ك ٠اُذخ ٍٞاُ ٠اُجيبٗبد ُِوشاءح كوؾ ثذ ٕٝئٌٓبٗيبد اُزؼذيَ كيٜب ,كيغت ػِيي إٔ روّٞ
ثايوبف اُخذٓخ اُز ٠رذػْ رؼذيَ اُجيبٗبد ٝاُز ٠رٞعذ ثذاخَ اُـ .DataContext
;) DataContext db = new DataContext( ConnectionString
;Db.ObjectTracjing = false
تذذيث انكيَُٕاث
٘ٛبى خذٓخ ك 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 );
ٙ اػـي٘بٝ 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 ...
ً اكزشػ٘ب كشػبُٞٝ ...دٌُٞزا اٛ اٗي ال رؾزبط ُششػٟ ا...ٚ رذسى ٓؼبٗيٝ ً عيذا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()
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رِي اُزو٘يخ اُز ٠عٞف رظجؼ ٖٓ اُي ّٞأ ْٛعضء
ك ٠ثشآغي .عٞاء ً٘ذ رؼَٔ ػِ ٠هٞاػذ ثيبٗبد أ ٝرؼَٔ ػِ ٠ا ٟش٠ء أخش.
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