@Icarus की प्रतिक्रिया का विस्तार करने के लिए: यदि आप दो क्षेत्रों द्वारा क्रमबद्ध करना चाहते हैं तो मैं निम्नलिखित कार्य कर सकता हूं (एक क्षेत्र के लिए इकारिस की प्रतिक्रिया बहुत अच्छी तरह से काम करती है)।
public static IQueryable<T> OrderByDynamic<T>(this IQueryable<T> q, string SortField1, string SortField2, bool Ascending)
{
var param = Expression.Parameter(typeof(T), "p");
var body = GetBodyExp(SortField1, SortField2, param);
var exp = Expression.Lambda(body, param);
string method = Ascending ? "OrderBy" : "OrderByDescending";
Type[] types = new Type[] { q.ElementType, exp.Body.Type };
var mce = Expression.Call(typeof(Queryable), method, types, q.Expression, exp);
return q.Provider.CreateQuery<T>(mce);
}
यह वह फ़ंक्शन है जो शरीर लैम्ब्डा अभिव्यक्ति के लिए लौटता है, यह स्ट्रिंग और इंट के साथ काम करता है, लेकिन प्रत्येक प्रोग्रामर की आवश्यकता के अनुसार इसे काम करने के लिए अधिक प्रकार जोड़ने के लिए पर्याप्त है
public static NewExpression GetBodyExp(string field1, string field2, ParameterExpression Parametro)
{
// SE OBTIENE LOS NOMBRES DE LOS TIPOS DE VARIABLE
string TypeName1 = Expression.Property(Parametro, field1).Type.Name;
string TypeName2 = Expression.Property(Parametro, field2).Type.Name;
// SE DECLARA EL TIPO ANONIMO SEGUN LOS TIPOS DE VARIABLES
Type TypeAnonymous = null;
if (TypeName1 == "String")
{
string var1 = "0";
if (TypeName2 == "Int32")
{
int var2 = 0;
var example = new { var1, var2 };
TypeAnonymous = example.GetType();
}
if (TypeName2 == "String")
{
string var2 = "0";
var example = new { var1, var2 };
TypeAnonymous = example.GetType();
}
}
if (TypeName1 == "Int32")
{
int var1 = 0;
if (TypeName2 == "Int32")
{
string var2 = "0";
var example = new { var1, var2 };
TypeAnonymous = example.GetType();
}
if (TypeName2 == "String")
{
string var2 = "0";
var example = new { var1, var2 };
TypeAnonymous = example.GetType();
}
}
//se declaran los TIPOS NECESARIOS PARA GENERAR EL BODY DE LA EXPRESION LAMBDA
MemberExpression[] args = new[] { Expression.PropertyOrField(Parametro, field1), Expression.PropertyOrField(Parametro, field2) };
ConstructorInfo CInfo = TypeAnonymous.GetConstructors()[0];
IEnumerable<MemberInfo> a = TypeAnonymous.GetMembers().Where(m => m.MemberType == MemberTypes.Property);
//BODY
NewExpression body = Expression.New(CInfo, args, TypeAnonymous.GetMembers().Where(m => m.MemberType == MemberTypes.Property));
return body;
}
इसका उपयोग करने के लिए निम्नलिखित किया जाता है
IQueryable<MyClass> IqMyClass= context.MyClass.AsQueryable();
List<MyClass> ListMyClass= IqMyClass.OrderByDynamic("UserName", "IdMyClass", true).ToList();
अगर ऐसा करने का कोई बेहतर तरीका है, तो वे इसे साझा करेंगे तो बहुत अच्छा होगा
मैं इसे धन्यवाद करने के लिए हल करने में कामयाब रहा: मैं Linq के साथ एक एकाधिक संपत्ति लैंबडा अभिव्यक्ति कैसे बना सकता हूं