سؤال

هل تعتبر LINQ ميزة جديدة في .NET 4.0، وغير مدعومة في الإصدارات الأقدم مثل .NET 3.5؟بماذا يستفاد منه؟يبدو أنه قادر على بناء أشجار التعبير.ما هي شجرة التعبير في الواقع؟هل LINQ قادر على استخراج معلومات مثل الفئة والطريقة والحقل من ملف C#؟

هل يمكن لأي شخص أن يقدم لي جزءًا من التعليمات البرمجية لتوضيح ما يمكن أن يفعله LINQ؟

هل كانت مفيدة؟

المحلول

لينك هي إحدى ميزات .NET 3.5 مع دعم اللغة المضمن من C# 3.0 وVisual Basic 2008.يوجد العديد من أمثلة على MSDN.

نصائح أخرى

تمت إضافة Linq في .Net 3.5 (وإضافته إلى مترجم c# 3.0 وكذلك بشكل محدود قليلاً إلى مترجم VB.net في نفس الإصدار)

إنه استعلام متكامل للغة، على الرغم من أنه يغطي العديد من الإضافات المعقدة لكل من اللغة ووقت التشغيل من أجل تحقيق ذلك وهو أمر مفيد في حد ذاته.

تتمثل وظيفة Expression ببساطة في تمكين البرنامج، في وقت التشغيل، من فحص التركيب المجرد لبعض بنيات التعليمات البرمجية التي تم تمريرها.وتسمى هذه لامدا.وهي في جوهرها طريقة لكتابة وظائف مجهولة المصدر بسهولة أكبر مع تسهيل عملية فحص بنيتها أثناء التشغيل.

وظيفة "SQL like" التي يرتبط بها Linq بشكل وثيق (على الرغم من أنها ليست الوحيدة بأي حال من الأحوال) تسمى Linq to Sql حيث يكون شيء مثل هذا:

from f in Foo where s.Blah == "wibble" select f.Wobble;

يتم تجميعها في تمثيل لهذا الاستعلام، بدلاً من مجرد التعليمات البرمجية ل ينفذ الاستعلام.الجزء الذي يحوله من linq إلى sql هو "الواجهة الخلفية" التي تحوله إلى sql.لهذا يتم ترجمة التعبير إلى عبارات خادم SQL لتنفيذ الاستعلام مقابل قاعدة بيانات مرتبطة مع التعيين من الصفوف إلى كائنات .net وتحويل منطق C# إلى جمل مكافئة.يمكنك تطبيق نفس الكود تمامًا إذا كان Foo عبارة عن مجموعة من كائنات .net البسيطة (عند هذه النقطة تكون "Linq إلى كائنات")، فسيكون تحويل التعبير بعد ذلك إلى كود .Net مستقيم.

إن لامدا أعلاه المكتوبة باللغة المتكاملة هي في الواقع ما يعادل:

Foo.Where(f => f.Blah == "wibble).Select(f => f.Wobble);

حيث Foo عبارة عن مجموعة مكتوبة.بالنسبة لقواعد البيانات، يتم تصنيع الفئات لتمثيل القيم الموجودة في قاعدة البيانات للسماح بتجميعها، وللسماح بقيم التعثر الدائرية من مناطق SQL إلى مناطق .net والعكس صحيح.

الجانب النقدي من لغة متكاملة جزء من Linq هو أن بنيات اللغة الناتجة هي أجزاء من الدرجة الأولى من الكود الناتج.بدلاً من مجرد إنشاء وظيفة، فإنها توفر الطريقة التي تم بها إنشاء الوظيفة (كتعبير) بحيث يمكن لجوانب أخرى من البرنامج التعامل معها.

قد يختار مستهلكو هذه الوظيفة ببساطة تشغيلها (تنفيذ الوظيفة التي تم تجميع لامدا إليها) أو طلب التعبير الذي يصفها ثم القيام بشيء مختلف بها.

تم وضع العديد من الجوانب التي تجعل هذا ممكنًا تحت شعار "Linq" على الرغم من عدم كونها تابعة لـ Linq.
على سبيل المثال، الأنواع المجهولة مطلوبة لسهولة الاستخدام projection (اختيار مجموعة فرعية من الخصائص المحتملة) ولكن يمكن استخدام الأنواع المجهولة خارج Linq أيضًا.

أدى Linq، خاصة عبر lambdas (التي تجعل كتابة المندوبين المجهولين خفيفة الوزن للغاية من حيث بناء الجملة) إلى زيادة القدرات الوظيفية لـ c#.يتم تعزيز ذلك من خلال طرق التمديد الموجودة على IEnumerable<T> مثل Select()، الموافق لـ map في العديد من اللغات الوظيفية و Where() المقابلة لـ filter.مثل الأنواع المجهولة، هذا ليس في حد ذاته "Linq" على الرغم من أن الكثيرين ينظرون إليه على أنه تأثير مفيد للغاية على تطوير C# (هذه ليست وجهة نظر عالمية ولكنها منتشرة على نطاق واسع).

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

ستكون الاستخدامات الأخرى عندما ترغب في الحصول على بعض البيانات التعريفية حول ما تفعله الأجزاء الداخلية للوظيفة، وربما بعد ذلك تجميع التعبير (مما يؤدي إلى تفويض يسمح لك بتنفيذ التعبير كدالة) والقيام بشيء ما به أو مجرد النظر إلى البيانات الوصفية للكائنات لعمل تعليمات برمجية عاكسة والتي يتم التحقق من وقت الترجمة عليها تظهر هذه الإجابة.

ومنطقة واحدة في هذه المسألة التي لم يتم تغطيتها حتى الآن لا أشجار التعبير. وهناك مادة جيدة حقا على الأشجار التعبير (والتعبير لامدا) المتاحة <لأ href = "http://blogs.msdn.com/charlie/archive/2008/01/31/expression-tree-basics.aspx" يختلط = "نوفولو noreferrer"> هنا .

والشيء الآخر المهم لإحضار حول أشجار التعبير هو أن من خلال بناء شجرة التعبير لتحديد ما <م> و تنوي القيام به، لم يكن لديك ل<م> في الواقع افعل أي شيء. وأنا أشير إلى تنفيذ المؤجلة.

//this code will only build the expression tree
var itemsInStock = from item in warehouse.Items
                   where item.Quantity > 0;

// this code will cause the actual execution
Console.WriteLine("Items in stock: {0}", itemsInStock.Count());

وقدم LINQ مع .NET Framework 3.5. هذا الموقع لديها الكثير من الأمثلة.

وكما تغطي هذا إلى حد ما على نطاق واسع هنا على SO .

وSystem.Linq.Expressions هو لبناء اليد (أو توليد الجهاز) أشجار التعبير. لدي شعور بأنه نظرا للتعقيد بناء وظائف أكثر تعقيدا أن هذه مساحة تحت المستخدمة. ولكن ما هو قوي جدا. على سبيل المثال واحدة من بلدي زملاء العمل نفذت مؤخرا شجرة التعبير التي يمكن على نطاق والسيارات أي LINQ إلى كائن SQL يستخدم دالة الكثافة cumultive. كل عمود يحصل شجرة الخاصة التي يحصل جمعت حتى في الصيام. لقد تم بناء مجمع المتخصصة التي يستخدمها على نطاق واسع لتنفيذ الوظائف الأساسية وكذلك الغراء بقية الشفرة التي تم إنشاؤها معا.

ويرجى الاطلاع على هذا بلوق وظيفة للحصول على مزيد من المعلومات والأفكار.

وهنا الكثير من ينق-الأمثلة:
http://msdn.microsoft.com/en-us/vcsharp/aa336746. ASPX

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top