اختيار العمود الديناميكي في 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