Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#LINQ OrderBy()表达式,创建嵌套泛型类型_C#_Entity Framework_Linq_Linq To Entities_Expression Trees - Fatal编程技术网

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);
}
请注意,我可能会犯一些小错误,因为我只是凭记忆写作