หากต้องการขยายการตอบกลับของ @Icarus: หากคุณต้องการเรียงลำดับตามสองฟิลด์ฉันสามารถใช้ฟังก์ชันต่อไปนี้ได้ (สำหรับฟิลด์เดียวการตอบสนองของ Icarius จะทำงานได้ดีมาก)
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);
}
นี่คือฟังก์ชั่นที่ร่างกายส่งกลับมาสำหรับนิพจน์แลมบ์ดามันทำงานร่วมกับสตริงและ int แต่ก็เพียงพอที่จะเพิ่มประเภทอื่น ๆ เพื่อให้มันทำงานได้ตามความต้องการของโปรแกรมเมอร์แต่ละคน
public static NewExpression GetBodyExp(string field1, string field2, ParameterExpression Parametro)
{
string TypeName1 = Expression.Property(Parametro, field1).Type.Name;
string TypeName2 = Expression.Property(Parametro, field2).Type.Name;
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();
}
}
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);
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 ได้อย่างไร