هل هناك نمط يستخدم Linq لإنشاء مرشح ديناميكيًا؟

StackOverflow https://stackoverflow.com/questions/30879

  •  09-06-2019
  •  | 
  •  

سؤال

هل هناك نمط يستخدم Linq لإنشاء مرشح ديناميكيًا؟

أحتاج إلى إنشاء تصفية مخصصة في القائمة، في الماضي كنت أقوم بإنشاء SQL ديناميكيًا... لا يبدو أن هذا ممكن مع Linq.

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

المحلول

تفحص ال مكتبة لينك الديناميكية من مدونة ScottGu:

على سبيل المثال، فيما يلي استعلام LINQ قياسي آمن للنوع إلى SQL VB يسترد البيانات من قاعدة بيانات Northwind ويعرضها في عنصر تحكم ASP.NET GridView:

Dim Northwind As New NorthwindDataContext
Dim query = From q In Northwind.Products Where p.CategoryID = 2 And p.UnitPrice > 3 Order By p.SupplierID Select p

Gridview1.DataSource = query
GridView1.DataBind()

باستخدام مكتبة LINQ DynamicQuery، يمكنني إعادة كتابة تعبير الاستعلام أعلاه بدلاً من ذلك

Dim Northwind As New NorthwindDataContext
Dim query = Northwind.Products .where("CategoryID=2 And UnitPrice>3") . OrderBy("SupplierId")
Gridview1.DataSource = query
GridView1.DataBind()

لاحظ كيف أن جملة الشرط حيث وعبارة الترتيب حسب تأخذ الآن تعبيرات السلسلة بدلاً من تعبيرات التعليمات البرمجية.نظرًا لأنها عبارة عن سلاسل مرتبطة متأخرًا، يمكنني بنائها ديناميكيًا.على سبيل المثال:يمكنني تقديم واجهة مستخدم لمحلل أعمال المستخدم النهائي باستخدام تطبيقي الذي يمكّنهم من إنشاء استعلامات بأنفسهم (بما في ذلك الجمل الشرطية التعسفية).

نصائح أخرى

يعد Dynamic Linq أحد الطرق التي يجب اتباعها.

قد يكون الأمر مبالغًا فيه بالنسبة للسيناريو الخاص بك.يعتبر:

IQueryable<Customer> query = db.Customers;

if (searchingByName)
{
  query = query.Where(c => c.Name.StartsWith(someletters));
}
if (searchingById)
{
  query = query.Where(c => c.Id == Id);
}
if (searchingByDonuts)
{
  query = query.Where(c => c.Donuts.Any(d => !d.IsEaten));
}
query = query.OrderBy(c => c.Name);
List<Customer> = query.Take(10).ToList();

شيء من هذا القبيل؟

var myList = new List<string> { "a","b","c" };
var items = from item in db.Items
            where myList.Contains(item.Name)
            select item;

من شأنه أن يخلق بيان SQL مثل

SELECT * FROM Items [t0] where Name IN ('a','b','c')
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top