C#LINQ OrderBy()表达式,创建嵌套泛型类型
我有一个C#LINQ OrderBy()表达式,创建嵌套泛型类型,c#,entity-framework,linq,linq-to-entities,expression-trees,C#,Entity Framework,Linq,Linq To Entities,Expression Trees,我有一个班级成员 class Person { string Name; int Age; DateTime BirthDate; } 我正在尝试创建一个表达式,以便根据给定的属性名称对IQueryable进行排序 public IQueryable<Person> Order(IQueryable<Person> input, string sortColumnName) { Type type = typeof(Person);
班级成员
class Person
{
string Name;
int Age;
DateTime BirthDate;
}
我正在尝试创建一个表达式
,以便根据给定的属性名称对IQueryable
进行排序
public IQueryable<Person> Order(IQueryable<Person> input, string sortColumnName)
{
Type type = typeof(Person);
PropertyInfo propertyInfo = type.GetProperty(sortColumnName);
Type pType = prop.Type;
ParameterExpression param = Expression.Parameter(type, "y");
Expression prop = param;
prop = Expression.Property(prop, propertyInfo);
// I want to achieve..
// var orderExpression = Expression.Lambda<Func<Person, "pType">>(prop, param);
// In order to do something like the above statement,
// I have to create a nested generic type of `Func<Person, "pType">`
Type e1 = typeof(Expression<>);
Type[] typeArgs = {typeof( Func <Person, pType>)};
Type orderType = e1.MakeGenericType(typeArgs);
// Need some help of how to create and use this Generic ""orderType"".
// ....
// Ultimately, it will by used somewhat like ...
//
// var orderExpression = Expression.Lambda<"orderType">(prop, param);
return input.OrderBy(orderExpression);
}
公共IQueryable顺序(IQueryable输入,字符串sortColumnName)
{
类型=类型(人);
PropertyInfo PropertyInfo=type.GetProperty(sortColumnName);
类型pType=prop.Type;
ParameterExpression param=表达式参数(类型为“y”);
表达式prop=param;
prop=Expression.Property(prop,propertyInfo);
//我想实现。。
//var orderExpression=Expression.Lambda(prop,param);
//为了做类似上述陈述的事情,
//我必须创建一个嵌套的泛型类型`Func`
e1型=类型(表达式);
类型[]typeArgs={typeof(Func)};
类型orderType=e1.MakeGenericType(类型args);
//需要有关如何创建和使用此通用“orderType”的帮助。
// ....
//最终,它将被使用,有点像。。。
//
//var orderExpression=Expression.Lambda(prop,param);
返回input.OrderBy(orderExpression);
}
我真的被表达式树的这种不一致行为弄糊涂了
在我的项目中,我有一个“IQueryable”“。其中(w1)
,可以轻松地接受表达式w1
我只是想通过创建一个“IQueryable.”OrderBy(o1)
,
来实现同样的目的
要成功使用表达式o1
我更愿意将所有内容保持为IQueryable
,而不必来回转换为inumerable
任何帮助都将不胜感激 我将留下通用解决方案。表达式树从一开始就是一场噩梦
公共IQueryable顺序(此IQueryable输入,字符串sortColumnName)
{
类型=类型(T);
var propertyInfo=type.GetProperty(sortColumnName);
如果(propertyInfo==null)
抛出新的InvalidOperationException();
var param=表达式参数(类型为“y”);
var orderLambda=表达式.Lambda(
表达式.MakeMemberAccess(参数,propertyInfo),
参数);
var queryExpr=Expression.Call(
类型(可查询),
“订购人”,
新类型[]{
input.ElementType,
propertyInfo.PropertyType},
input.Expression,
订单(λ);
返回input.Provider.CreateQuery(queryExpr);
}
请注意,我可能会犯一些小错误,因为我只是凭记忆写作