"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف يمكنني تحديد الأعمدة ديناميكيًا في استعلامات LINQ؟

كيف يمكنني تحديد الأعمدة ديناميكيًا في استعلامات LINQ؟

نشر في 2025-02-26
تصفح:271

How Can I Dynamically Select Columns in LINQ Queries?

اختيار العمود الديناميكي في LINQ

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

النظر في فئة البيانات التالية:

public class Data
{
    public string Field1 { get; set; }
    public string Field2 { get; set; }
    public string Field3 { get; set; }
    public string Field4 { get; set; }
    public string Field5 { get; set; }
}

لتحديد أعمدة محددة ديناميكيًا ، يمكنك استخدام طريقة CreateNewStatement لإنشاء تعبير Lambda ديناميكيًا:

private Func CreateNewStatement(string fields)
{
    var xParameter = Expression.Parameter(typeof(Data), "o");
    var xNew = Expression.New(typeof(Data));

    var bindings = fields.Split(',')
        .Select(o => o.Trim())
        .Select(o =>
        {
            var mi = typeof(Data).GetProperty(o);
            var xOriginal = Expression.Property(xParameter, mi);
            return Expression.Bind(mi, xOriginal);
        });

    var xInit = Expression.MemberInit(xNew, bindings);
    var lambda = Expression.Lambda>(xInit, xParameter);
    return lambda.Compile();
}

تأخذ هذه الطريقة قائمة مفصولة بالفاصلة من الحقول كسلسلة وينشئ بشكل ديناميكي تعبير Lambda يهيئة كائن بيانات جديد بالحقل المحدد.

يمكنك بعد ذلك استخدام طريقة CreateNewStatement لإنشاء تعبير Lambda وتمريره لتحديد:

var result = list.Select(CreateNewStatement("Field1, Field2"));

سيؤدي هذا إلى إرجاع سلسلة من كائنات البيانات مع الحقل المحدد ملء. لاحظ أن هذه التقنية مناسبة للحالات التي لا يُعرف فيها الحقل المحدد في وقت الترجم. إذا كان الحقل المحدد ثابتًا ، فمن المفيد استخدام تعبيرات Lambda العادية أو الأساليب القائمة على الانعكاس.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3