استعلام متكامل باللغة

يُعد Language Integrated Query ( LINQ ، الذي يُنطق "link") مكونًا من مكونات إطار عمل Microsoft .NET الذي يضيف إمكانيات الاستعلام عن البيانات الأصلية إلى لغات .NET ، وقد تم إصداره في الأصل كجزء رئيسي من .NET Framework 3.5 في عام 2007.

تُوسّع LINQ اللغة بإضافة تعابير الاستعلام ، وهي شبيهة بعبارات SQL ، ويمكن استخدامها لاستخراج البيانات ومعالجتها بسهولة من المصفوفات ، والفئات القابلة للتعداد ، ومستندات XML ، وقواعد البيانات العلائقية ، ومصادر البيانات الخارجية. تشمل الاستخدامات الأخرى، التي تستخدم تعابير الاستعلام كإطار عام لتكوين عمليات حسابية متنوعة بشكل مقروء، إنشاء معالجات الأحداث [ 1 ] أو محللات الموناد [ 2 ] . كما تُعرّف مجموعة من أسماء الدوال (تُسمى عوامل تشغيل الاستعلام القياسية ، أو عوامل تشغيل التسلسل القياسية )، بالإضافة إلى قواعد الترجمة التي يستخدمها المُصرّف لترجمة تعابير بناء جملة الاستعلام إلى تعابير باستخدام أسلوب سلس (يُسمى بناء جملة الدوال من قِبل مايكروسوفت) مع أسماء الدوال هذه، وتعابير لامدا، والأنواع المجهولة .

بنيان

واجهة برمجة تطبيقات عامل الاستعلام القياسي

فيما يلي، تستند أوصاف المعاملات إلى تطبيقها في التعامل مع المجموعات. تأخذ العديد من هذه المعاملات دوالًا أخرى كوسائط. ويمكن توفير هذه الدوال على شكل دالة مُسماة أو دالة مجهولة.

تُعرض مجموعة عوامل الاستعلام المُعرّفة بواسطة LINQ للمستخدم كواجهة برمجة تطبيقات ( API ) لعامل الاستعلام القياسي (SQO). عوامل الاستعلام التي تدعمها واجهة برمجة التطبيقات هي: [ 3 ]

Select

Selectيقوم المُشغِّل بإسقاط البيانات على المجموعة لاختيار الجوانب المهمة للعناصر. يُدخل المستخدم دالةً اختيارية، على شكل تعبير مُسمّى أو تعبير لامدا ، تُسقط عناصر البيانات. تُمرَّر الدالة إلى المُشغِّل كمُفوَّض . يُنفِّذ هذا دالة Map من الرتبة العليا.

Where

يُتيح هذا Whereالمُعامل تعريف مجموعة من قواعد الشرط التي تُقيّم لكل عنصر في المجموعة، بينما تُستبعد العناصر التي لا تُطابق القاعدة. يُمرر الشرط إلى المُعامل كمُفوّض. يُنفّذ هذا دالة التصفية من الرتبة العليا.

SelectMany

بالنسبة لعملية الربط التي يُدخلها المستخدم بين عناصر المجموعة والمجموعات، تُنفذ خطوتان دلاليًا. أولًا، يُربط كل عنصر بمجموعته المقابلة. ثانيًا، تُبسط نتيجة الخطوة الأولى بمقدار مستوى واحد. Selectويمكن Whereتنفيذ كلتا الخطوتين باستخدام LINQ SelectMany، طالما توفرت المجموعات الفردية والفارغة. مع ذلك، تُلزم قواعد الترجمة المذكورة أعلاه مُزود LINQ بتوفير المعاملين الآخرين. وهذا يُنفذ دالة الربط من الرتبة العليا.

Sum، Min، Max،Average

تأخذ هذه المعاملات، اختيارياً، دالةً تسترجع قيمةً عدديةً معينةً من كل عنصر في المجموعة، وتستخدمها لإيجاد مجموع أو أدنى أو أعلى أو متوسط ​​قيم جميع عناصر المجموعة، على التوالي. أما النسخ المُحمّلة فلا تأخذ أي دالة، وتعمل كما لو أن الدالة المحايد مُعطاة كدالة لامدا.

Aggregate

Sumعامل `// Min` مُعمّم Max. يأخذ هذا العامل دالةً تُحدد كيفية دمج قيمتين لتكوين نتيجة وسيطة أو نهائية. يُمكن اختيارياً تحديد قيمة ابتدائية، مما يسمح بأن يكون نوع نتيجة التجميع عشوائياً. علاوة على ذلك، يُمكن تحديد دالة نهائية، تُحوّل نتيجة التجميع إلى قيمة أخرى. يُنفّذ هذا دالة الطي من الرتبة العليا.

Join،GroupJoin

Joinيُجري هذا المُعامل عملية ربط داخلي بين مجموعتين، بناءً على تطابق المفاتيح بين الكائنات في كل مجموعة. ويأخذ دالتين كمُفوَّضين، واحدة لكل مجموعة، حيث يُنفِّذها على كل كائن في المجموعة لاستخراج المفتاح منه. كما يأخذ مُفوَّضًا آخر يُحدِّد فيه المستخدم عناصر البيانات التي سيتم استخدامها، من بين العنصرين المُتطابقين، لإنشاء الكائن الناتج. يُجري هذا المُعامل أيضًا GroupJoinعملية ربط جماعي . ومثل Selectالمُعامل السابق، تكون نتائج الربط عبارة عن نسخ من فئة مختلفة، تحتوي على جميع عناصر البيانات من كلا نوعي الكائنات المصدرية، أو مجموعة فرعية منها.

Take،TakeWhile

يقوم العامل Takeبتحديد الكائنات الأولى nمن مجموعة، بينما TakeWhileيقوم العامل الذي يأخذ شرطًا بتحديد تلك الكائنات التي تطابق الشرط (ويتوقف عند أول كائن لا يطابقه).

Skip،SkipWhile

تُعتبر المعاملات " Skipو SkipWhile" مكملات للمعامل " Takeو TakeWhile" - فهي تتخطى الكائنات الأولى nمن مجموعة، أو تلك الكائنات التي تطابق شرطًا (في حالة "و SkipWhile").

OfType

يُستخدم هذا OfTypeالمعامل لتحديد العناصر من نوع معين.

Concat

يقوم هذا Concatالمعامل بدمج مجموعتين.

OrderBy،ThenBy

يُستخدم هذا OrderByالمعامل لتحديد ترتيب الفرز الأساسي للعناصر في مجموعة وفقًا لمفتاح معين. الترتيب الافتراضي هو تصاعدي، ولعكس الترتيب، OrderByDescendingيُستخدم المعامل . ThenByويُحدد ThenByDescendingهذا المعامل الترتيب اللاحق للعناصر. يُحدد المستخدم الدالة التي تستخرج قيمة المفتاح من الكائن كمفوض.

Reverse

يقوم هذا Reverseالعامل بعكس عملية التجميع.

GroupBy

يأخذ هذا GroupByالمعامل دالة تستخرج قيمة مفتاحية وتعيد مجموعة من System.Linq.IGrouping<K, V>الكائنات، لكل قيمة مفتاحية مميزة. System.Linq.IGrouping<K, V>ويمكن استخدام هذه الكائنات بعد ذلك لحصر جميع الكائنات الخاصة بقيمة مفتاحية معينة.

Distinct

يزيل هذا Distinctالمعامل النسخ المكررة من كائن ما من مجموعة. ويأخذ أحد أشكال هذا المعامل كائن مقارنة للمساواة يحدد معايير التمييز.

Union، Intersect،Except

تُستخدم هذه المعاملات لإجراء عمليات الاتحاد والتقاطع والفرق على سلسلتين ، على التوالي. ولكل منها دالة مُحمّلة تأخذ كائن مُقارنة للمساواة يُحدد معايير تساوي العناصر.

SequenceEqual

يحدد هذا SequenceEqualالعامل ما إذا كانت جميع العناصر في مجموعتين متساوية وبنفس الترتيب.

First، FirstOrDefault، Last،LastOrDefault

تأخذ هذه المعاملات شرطًا. Firstيُعيد المعامل الأول أول عنصر يُحقق الشرط، أو يُطلق استثناءً في حال عدم وجود تطابق. FirstOrDefaultيُشبه المعامل الثاني Firstالمعامل الأول، إلا أنه يُعيد القيمة الافتراضية لنوع العنصر (عادةً مرجع فارغ ) في حال عدم وجود تطابق. Lastيسترجع المعامل الثالث آخر عنصر يُحقق الشرط، أو يُطلق استثناءً في حال عدم وجود تطابق. LastOrDefaultيُعيد المعامل الرابع قيمة العنصر الافتراضية في حال عدم وجود تطابق.

Single،SingleOrDefault

يأخذ هذا Singleالمعامل شرطًا ويعيد العنصر الذي يطابق هذا الشرط. ويُثار استثناء إذا لم يطابق أي عنصر الشرط أو إذا طابقه أكثر من عنصر واحد.

يأخذ هذا SingleOrDefaultالمعامل شرطًا ويعيد العنصر الذي يطابق هذا الشرط. إذا تطابق أكثر من عنصر مع الشرط، يتم طرح استثناء. أما إذا لم يتطابق أي عنصر مع الشرط، فيتم إرجاع قيمة افتراضية.

ElementAt

يقوم المعامل ElementAtباسترجاع العنصر الموجود في فهرس معين في المجموعة.

Any،All

يتحقق المعامل Anyمن وجود أي عناصر في المجموعة تُطابق الشرط. لا يقوم المعامل بتحديد العنصر، ولكنه يُرجع القيمة "صحيح" إذا تم مطابقة عنصر واحد على الأقل. استدعاء الدالة "أي" بدون شرط يُرجع القيمة "صحيح" إذا كانت المجموعة غير فارغة. Allيُرجع المعامل القيمة "صحيح" إذا كانت جميع العناصر تُطابق الشرط.

Contains

يتحقق المعامل Containsمما إذا كانت المجموعة تحتوي على عنصر معين.

Count

يحسب هذا Countالمعامل عدد العناصر في المجموعة المعطاة. أما الدالة المُحمّلة التي تأخذ شرطًا، فتحسب عدد العناصر المطابقة لهذا الشرط.

تحويل مجموعة إلى نوع آخر

تحدد واجهة برمجة تطبيقات عامل الاستعلام القياسي أيضًا عوامل تشغيل معينة تقوم بتحويل مجموعة إلى نوع آخر: [ 3 ]

  • AsEnumerable: يقوم بتحديد أنواع المجموعة بشكل ثابت كـ System.Collections.Generic.IEnumerable<T>. [ 4 ]
  • AsQueryable: يقوم بتحديد أنواع المجموعة بشكل ثابت كـ System.Linq.IQueryable<T>.
  • ToArray: يُنشئ مصفوفة T[]من المجموعة.
  • ToList: يُنشئ عنصرًا System.Collections.Generic.List<T>من المجموعة.
  • ToDictionary: ينشئ عنصرًا System.Collections.Generic.Dictionary<K, V>من المجموعة، مفهرسًا بواسطة المفتاح K. تقوم دالة الإسقاط التي يوفرها المستخدم باستخراج مفتاح من كل عنصر.
  • ToLookup: ينشئ عنصرًا System.Linq.Lookup<K, V>من المجموعة، مفهرسًا بواسطة المفتاح K. تقوم دالة الإسقاط التي يوفرها المستخدم باستخراج مفتاح من كل عنصر.
  • Castيحوّل هذا الأمر مجموعة غير عامة System.Collections.IEnumerableإلى مجموعة عامة System.Collections.Generic.IEnumerable<T>عن طريق تحويل كل عنصر إلى النوع المحدد T. أو يحوّل مجموعة عامة System.Collections.Generic.IEnumerable<T>إلى مجموعة عامة أخرى System.Collections.Generic.IEnumerable<R>عن طريق تحويل كل عنصر من النوع المحدد Tإلى النوع المحدد R. ويُصدر استثناءً إذا تعذّر تحويل أي عنصر إلى النوع المحدد.
  • OfTypeيحوّل هذا الأمر مجموعة غير عامة System.Collections.IEnumerableإلى إحدى المجموعات العامة System.Collections.Generic.IEnumerable<T>. أو يحوّل مجموعة عامة System.Collections.Generic.IEnumerable<T>إلى مجموعة عامة أخرى System.Collections.Generic.IEnumerable<R>عن طريق محاولة تحويل كل عنصر من النوع Tإلى النوع المطلوب R. في كلتا الحالتين، يتم تضمين مجموعة فرعية فقط من العناصر التي تم تحويلها بنجاح إلى النوع المستهدف. لا يتم طرح أي استثناءات.

امتدادات اللغة

على الرغم من أن LINQ مُصممة بشكل أساسي كمكتبة لـ .NET Framework 3.5، إلا أنها تُعرّف أيضًا امتدادات لغوية اختيارية تجعل الاستعلامات بنية لغوية أساسية، وتُوفر اختصارًا برمجيًا لكتابة الاستعلامات. وقد طُبقت هذه الامتدادات اللغوية مبدئيًا في C# 3.0، و VB 9.0 ، و F # ، و Oxygene ، مع إعلان لغات أخرى مثل Nemerle عن دعم مبدئي لها. وتشمل هذه الامتدادات اللغوية ما يلي :

  • صيغة الاستعلام: للغة حرية اختيار صيغة استعلام تتعرف عليها بشكل أصلي. يجب على المترجم ترجمة كلمات اللغة الرئيسية هذه إلى استدعاءات مناسبة لأساليب LINQ.
  • المتغيرات ذات الأنواع الضمنية: يتيح هذا التحسين تعريف المتغيرات دون تحديد أنواعها. في لغتي C# 3.0 [ 5 ] : 367 وOxygene، يتم تعريفها باستخدام varالكلمة المفتاحية `type`. في VB9.0، Dimتؤدي الكلمة المفتاحية `type` بدون تعريف النوع نفس الغرض. تظل هذه الكائنات ذات أنواع محددة بدقة ؛ بالنسبة لهذه الكائنات، يستنتج المترجم أنواع المتغيرات عبر استنتاج النوع ، مما يسمح بتحديد نتائج الاستعلامات وتعريفها دون الحاجة إلى تعريف نوع المتغيرات الوسيطة.
  • الأنواع المجهولة : تسمح الأنواع المجهولة للمترجم باستنتاج أنواع الفئات التي تحتوي فقط على تعريفات لأعضاء البيانات. يُعد هذا مفيدًا لمعاملات Select وJoin، حيث قد تختلف أنواع نتائجها عن أنواع الكائنات الأصلية. يستخدم المترجم استنتاج الأنواع لتحديد الحقول الموجودة في الفئات، ويُنشئ دوال الوصول والتعديل لهذه الحقول.
  • مُهيئ الكائن : تسمح مُهيئات الكائنات بإنشاء كائن وتهيئته في نطاق واحد، كما هو مطلوب لعوامل Select و Join.
  • تعابير لامدا : تسمح تعابير لامدا بكتابة المسندات ووظائف الإسقاط الأخرى ضمن النص باستخدام صيغة مختصرة، وتدعم الإغلاق المعجمي الكامل. يتم تضمينها في المعاملات كمفوضين أو أشجار تعبيرية حسب موفر الاستعلام.

على سبيل المثال، في الاستعلام لتحديد جميع العناصر في مجموعة تحتوي على SomePropertyأقل من 10،

باستخدام System ؛ باستخدام System.Collections.Generic ؛IEnumerable <MyObject> SomeCollection = / * شيء ما هنا * / ;IEnumerable <MyObject> results = from c in SomeCollection where c.SomeProperty < 10 select new { c.SomeProperty , c.OtherProperty } ;foreach ( MyObject result in results ) { Console.WriteLine ( result ) ; }

أنواع المتغيرات result، cويستنتجها resultsالمترجم جميعها وفقًا لتوقيعات الطرق المستخدمة في النهاية. ويستند اختيار الطرق إلى نتيجة الترجمة الخالية من تعبير الاستعلام.

باستخدام System ؛ باستخدام System.Collections.Generic ؛IEnumerable <MyObject> results = SomeCollection.Where ( c = > c.SomeProperty < 10 ) .Select ( c = > new { c.SomeProperty , c.OtherProperty } ) ;النتائج . لكل عنصر ( x => { Console.WriteLine ( x.ToString ( ) ); } )

مزودو LINQ

تُحدد مواصفات C# 3.0 نمط تعبير الاستعلام، بالإضافة إلى قواعد الترجمة من تعبير LINQ إلى تعبير في مجموعة فرعية من C# 3.0 لا تحتوي على تعبيرات LINQ. الترجمة المُحددة بهذه الطريقة غير مُحددة النوع، مما يُتيح، بالإضافة إلى إمكانية تفسير تعبيرات لامدا إما كمفوضين أو أشجار تعبير، درجة عالية من المرونة للمكتبات التي ترغب في عرض أجزاء من واجهتها كعبارات تعبير LINQ. على سبيل المثال، يعمل LINQ to ObjectsSystem.Collections.Generic.IEnumerable<T> على الكائنات باستخدام المفوضين، بينما يستخدم LINQ to SQL أشجار التعبير.

تُشكّل أشجار التعبير جوهر آلية قابلية توسيع LINQ، والتي تُمكّن من تكييف LINQ مع مصادر بيانات متعددة. تُسلّم أشجار التعبير إلى مُزوّدي LINQ، وهي تطبيقات خاصة بكل مصدر بيانات، تُكيّف استعلامات LINQ لتتوافق مع مصدر البيانات. عند الحاجة، يُحلّل مُزوّدو LINQ أشجار التعبير المُضمّنة في الاستعلام لتوليد العناصر الأساسية اللازمة لتنفيذه. قد تكون هذه العناصر أجزاءً من لغة SQL أو أي تمثيل آخر مختلف تمامًا للتعليمات البرمجية كبيانات قابلة للمعالجة. يتضمن LINQ مُزوّدي LINQ لمجموعات الكائنات في الذاكرة، وقواعد بيانات Microsoft SQL Server ، ومجموعات بيانات ADO.NET، ومستندات XML. تُحدّد هذه المُزوّدات المختلفة أنواع LINQ المُختلفة.

LINQ to Objects

يُستخدم موفر LINQ to Objects للمجموعات الموجودة في الذاكرة، وذلك باستخدام محرك تنفيذ الاستعلامات المحلي لـ LINQ. يشير الكود المُولّد بواسطة هذا الموفر إلى تنفيذ عوامل تشغيل الاستعلامات القياسية كما هو مُعرّف في Sequenceالنمط، ويسمح System.Collections.Generic.IEnumerable<T>بالاستعلام عن المجموعات محليًا. يُجري التنفيذ الحالي لـ LINQ to Objects فحوصات لتنفيذ الواجهة للسماح بإجراء اختبارات عضوية سريعة، وعمليات عدّ، وعمليات بحث مُفهرسة عندما يدعمها نوع وقت التشغيل System.Collections.Generic.IEnumerable<T>. [ 8 ] [ 9 ] [ 10 ]

LINQ to XML (المعروف سابقًا باسم XLINQ)

يقوم موفر LINQ to XML بتحويل مستند XML إلى مجموعة من System.Linq.Xml.XElementالكائنات، والتي يتم الاستعلام عنها بعد ذلك باستخدام محرك التنفيذ المحلي المُضمّن في تطبيق عامل الاستعلام القياسي. [ 11 ] يقوم موفر LINQ to XML بتحويل مستند XML إلى مجموعة من System.Linq.Xml.XElementالكائنات، والتي يتم الاستعلام عنها بعد ذلك باستخدام محرك التنفيذ المحلي المُضمّن في تطبيق عامل الاستعلام القياسي. [ 12 ]

LINQ to SQL (المعروف سابقًا باسم DLINQ)

يُتيح مُزوّد ​​LINQ to SQL استخدام LINQ للاستعلام عن قواعد بيانات Microsoft SQL Server ، بما في ذلك قواعد بيانات SQL Server Compact . ونظرًا لأن بيانات SQL Server قد تكون موجودة على خادم بعيد، ولأن SQL Server يمتلك مُحرك استعلام خاص به، فإن LINQ to SQL لا يستخدم مُحرك استعلام LINQ. بدلاً من ذلك، يُحوّل استعلام LINQ إلى استعلام SQL يُرسل بعد ذلك إلى SQL Server للمعالجة. [ 13 ] ومع ذلك، ولأن SQL Server يُخزّن البيانات كبيانات علائقية ، بينما يعمل LINQ مع البيانات المُغلّفة في كائنات، يجب ربط التمثيلين ببعضهما البعض. لهذا السبب، يُعرّف LINQ to SQL أيضًا إطار عمل للربط. يتم الربط من خلال تعريف فئات تُطابق الجداول في قاعدة البيانات، وتحتوي على جميع أعمدة الجدول أو مجموعة فرعية منها كأعضاء بيانات. [ 14 ] يتم تحديد هذا الربط، إلى جانب سمات نموذج العلاقات الأخرى مثل المفاتيح الأساسية ، باستخدام سمات مُعرّفة في LINQ to SQL . على سبيل المثال،

باستخدام System.Data.Linq ؛[Table(Name="Customers")] public class Customer { [Column(IsPrimaryKey = true)] public int CustID ;[العمود] سلسلة عامة CustName ; }

يُشير تعريف هذا الصنف إلى جدول مُسمى Customers، ويتوافق عضوا البيانات مع عمودين. يجب تعريف الأصناف قبل استخدام LINQ to SQL. يتضمن Visual Studio 2008 مصممًا للربط يُستخدم لإنشاء الربط بين مخططات البيانات في الكائن، وكذلك المجال العلائقي. يُمكنه إنشاء الأصناف المُقابلة تلقائيًا من مخطط قاعدة البيانات ، كما يُتيح التحرير اليدوي لإنشاء عرض مختلف باستخدام مجموعة فرعية فقط من الجداول أو الأعمدة في جدول. [ 14 ]

يتم تنفيذ عملية الربط بواسطة System.Data.Linq.DataContextواجهة تأخذ سلسلة اتصال بالخادم، ويمكن استخدامها لإنشاء جدول بيانات System.Data.Linq.Table<T>حيث Tيمثل نوع البيانات الذي سيتم ربط جدول قاعدة البيانات به. تقوم هذه الواجهة System.Data.Linq.Table<T>بتغليف البيانات في الجدول، وتنفيذ System.Linq.IQueryable<T>الواجهة، بحيث يتم إنشاء شجرة التعبير التي يتعامل معها موفر LINQ to SQL. تقوم الواجهة بتحويل الاستعلام إلى T-SQL واسترجاع مجموعة النتائج من خادم قاعدة البيانات. نظرًا لأن المعالجة تتم على خادم قاعدة البيانات، فلا يمكن استخدام الطرق المحلية غير المُعرَّفة كجزء من تعبيرات لامدا التي تُمثل الشروط. ومع ذلك، يمكن استخدام الإجراءات المخزنة على الخادم. يتم تتبع أي تغييرات على مجموعة النتائج ويمكن إرسالها مرة أخرى إلى خادم قاعدة البيانات. [ 14 ]

LINQ to DataSets

بما أن موفر LINQ to SQL (المذكور أعلاه) يعمل فقط مع قواعد بيانات Microsoft SQL Server ، ولدعم أي قاعدة بيانات عامة، يتضمن LINQ أيضًا LINQ to DataSets. يستخدم هذا الموفر ADO.NET لإدارة الاتصال بقاعدة البيانات. بمجرد أن تصبح البيانات في مجموعات بيانات ADO.NET، يقوم LINQ to DataSets بتنفيذ الاستعلامات على هذه المجموعات. [ 15 ]

أداء

قد يواجه المستخدمون غير المحترفين صعوبة في فهم تفاصيل ميزات وبنية LINQ to Objects . وقد تؤدي أنماط تطبيق LINQ البسيطة إلى تدهور كارثي في ​​الأداء. [ 16 ] [ 17 ]

يعتمد أداء LINQ to XML و LINQ to SQL مقارنةً بـ ADO.NET على حالة الاستخدام. [ 18 ] [ 19 ]

بلينك

يتضمن الإصدار الرابع من إطار عمل .NET امتدادات متوازية لـ Parallel LINQ (PLINQ)، وهو محرك تنفيذ متوازٍ لاستعلامات LINQ. يُعرّف هذا الإصدار System.Linq.ParallelQuery<T>فئةً معينة. يمكن لأي تطبيق للواجهة System.Collections.Generic.IEnumerable<T>الاستفادة من محرك PLINQ عن طريق استدعاء دالة الامتداد المُعرّفة في مساحة اسم الفئة الخاصة بإطار عمل .NET. [ 20 ] يستطيع محرك PLINQ تنفيذ أجزاء من الاستعلام بشكل متزامن على عدة خيوط، مما يوفر نتائج أسرع. [ 21 ]AsParallel<T>(thisIEnumerable<T>)System.Linq.ParallelEnumerable

اللغات السابقة

تم اختبار العديد من المفاهيم التي قدمها LINQ في الأصل في مشروع بحث Cω التابع لشركة مايكروسوفت، والذي كان يُعرف سابقًا بالأسماء الرمزية X# (X Sharp) و Xen . تمت إعادة تسميته إلى Cω بعد دمج Polyphonic C# (لغة بحثية أخرى تعتمد على مبادئ حساب الربط ) فيه.

تسعى لغة Cω إلى جعل الوصول إلى مخازن البيانات (مثل قواعد البيانات ومستندات XML ) بنفس سهولة وأمان أنواع البيانات التقليدية كالسلاسل النصية والمصفوفات . وقد استُمدّت العديد من هذه الأفكار من مشروع تجريبي سابق ضمن فريق WebData XML يُدعى X# وXen. كما تتضمن Cω بنيات جديدة لدعم البرمجة المتزامنة ؛ وقد استُمدّت هذه الميزات بشكل كبير من مشروع Polyphonic C# السابق. [ 22 ]

أُتيحت ميزات Cω لأول مرة في عام 2004 كمعاينة للمترجم، ثم استخدمتها مايكروسوفت لاحقًا في إنشاء ميزات LINQ التي صدرت في عام 2007 في الإصدار 3.5 من .NET [ 23 ]. كما تم إصدار بنيات التزامن في شكل مُعدّل قليلاً كمكتبة، تُسمى مكتبة Joins Concurrency ، للغة C# ولغات .NET الأخرى بواسطة مايكروسوفت للأبحاث . [ 24 ]

انظر أيضاً

مراجع

  1. "إطار عمل Rx" . 10 يونيو 2011.
  2. "مُركِّبات المُحلِّل الأحادي باستخدام لغة C#3" . تم الاطلاع عليه بتاريخ 21-11-2009 .
  3. 1 2 "عوامل تشغيل الاستعلام القياسية" . مايكروسوفت . تم الاسترجاع في 30-11-2007 .
  4. "فئة قابلة للتعداد" . msdn . مايكروسوفت . تم الاطلاع عليه بتاريخ 15 فبراير 2014 .
  5. 1 2 سكيت، جون (23 مارس 2019). لغة سي شارب بتفصيل . مانينغ. ISBN 978-1617294532.
  6. "تعبيرات الاستعلام (F#)" . وثائق مايكروسوفت . تم الاطلاع عليه بتاريخ 19-12-2012 .
  7. "إطار عمل LINQ" . تم الاطلاع عليه بتاريخ 30-11-2007 .
  8. "Enumerable.ElementAt" . تم الاسترجاع في 2014-05-07 .
  9. "Enumerable.Contains" . تم الاسترجاع في 2014-05-07 .
  10. "Enumerable.Count" . تم الاسترجاع في 2014-05-07 .
  11. "استعلام متكامل بلغة .NET لبيانات XML" . 30 أبريل 2007. تم الاطلاع عليه بتاريخ 30 نوفمبر 2007 .
  12. "استعلام متكامل بلغة .NET لبيانات XML" . 30 أبريل 2007. تم الاطلاع عليه بتاريخ 30 نوفمبر 2007 .
  13. "LINQ to SQL" . تم الاطلاع عليه بتاريخ 30-11-2007 .{{cite web}}: CS1 maint: deprecated archiveal service ( link )
  14. 1 2 3 "LINQ to SQL: استعلام متكامل بلغة .NET للبيانات العلائقية" . 30 أبريل 2007. تم الاطلاع عليه بتاريخ 30 نوفمبر 2007 .
  15. "LINQ to DataSets" . تم الاسترجاع في 30-11-2007 .{{cite web}}: CS1 maint: deprecated archiveal service ( link )
  16. فيدر، جاي (21-12-2007). "اختبار أداء LINQ: أول مشروع لي في Visual Studio 2008" . تم الاسترجاع في 8-02-2009 .
  17. بارسونز، جاريد (2008). "تحسين أداء استعلامات LINQ" . شبكة مطوري مايكروسوفت . تم الاطلاع عليه بتاريخ 19 مارس 2014. على الرغم من أن LINQ قوي وفعال للغاية، إلا أن مجموعات البيانات الكبيرة قد تتسبب في مشاكل أداء غير متوقعة.
  18. ألفا، خايمي (2010-08-06). "مشكلات الأداء المحتملة مع إعادة تجميع استعلامات LINQ المُجمَّعة" . شبكة مطوري مايكروسوفت . تم الاسترجاع في 2014-03-19 . عند استدعاء استعلام عدة مرات باستخدام Entity Framework، يُوصى باستخدام استعلامات LINQ المُجمَّعة. يؤدي تجميع الاستعلام إلى انخفاض في الأداء عند استخدامه لأول مرة، ولكن الاستدعاءات اللاحقة تُنفَّذ بشكل أسرع بكثير.
  19. كشيتيج، باندي (25-05-2008). "مقارنات الأداء بين LinQ وSQL وADO وC#" . تم الاطلاع عليه بتاريخ 08-02-2009 .
  20. "فئة ParallelEnumerable" . تم الاسترجاع في 2014-05-07 .
  21. "البرمجة في عصر التزامن: البرمجة المتزامنة باستخدام PFX" . تم الاطلاع عليه بتاريخ 16-10-2007 .
  22. إيشرت، ستيف؛ وولي، جيمس ب.؛ مارغيري، فابريس (2008). LINQ في العمل . مانينغ. الصفحات 56-57 (كما ورد في رابط بحث كتب جوجل - لا يحتوي الكتاب على أرقام صفحات). ISBN  9781638354628.
  23. مفاهيم أساسية في لغة C# 3.0 | مقالات | TomasP.Net مؤرشف في 12 فبراير 2007 على موقع Wayback Machine
  24. "مكتبة التزامن Joins" . تم الاطلاع عليه بتاريخ 2007-06-08 .