在 MemberExpression 上连接一个 MethodCallExpression
concatenate a MethodCallExpression on MemberExpression
我希望使用表达式树创建以下 Linq 表达式:
var result2 = soldiers.OrderByDescending(soldier => soldier.Ranks.OrderBy(r=> r.Date).FirstOrDefault().Date).ToArray() ;
问题末尾列出型号
我尝试执行以下操作:
ParameterExpression pe = Expression.Parameter(typeof(Soldier), "soldier");
// e.g soldier.ranks
MemberExpression rank = Expression.Property(pe, "ranks");
ParameterExpression nestedParams = Expression.Parameter(typeof(Rank), "rank");
var dateProperty = typeof(Rank).GetProperty("Date");
// e.g rank.Date
MemberExpression nestedExpression= Expression.MakeMemberAccess(nestedParams, dateProperty);
// e.g rank => rank.date
var orderByExp = Expression.Lambda<Func<Rank, DateTime?>>(nestedExpression, nestedParams);
MethodCallExpression orderByCallExpression2 = Expression.Call(
typeof(Queryable),
"OrderByDescending",
new Type[] { typeof(Rank), typeof(DateTime?) },
rank, ***// i suspect the problem is in this line #110***
orderByExp);
但是发现如下错误:
System.InvalidOperationException: 'No generic method 'OrderByDescending' on type 'System.Linq.Queryable' is compatible with the supplied type arguments and arguments. No type arguments should be provided if the method is non-generic. '
正如我在代码注释中所写,我怀疑问题是由于第 110 行引起的。
我试图在 soldier.ranks
属性 上连接 orderBy 方法。
但也许因为 `soldier.ranks 是 MemberExpression 而不是 MethodCallExpression 或 Queryable,我无法执行该操作。
我将这两个链接用作参考,但可以找到任何与我的问题相似的内容。
* https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/expression-trees/how-to-use-expression-trees-to-build-dynamic-queries
*
型号:
public class Soldier
{
public Rank Rank {
get {
return this.Ranks.OrderByDescending(m => m.Date).FirstOrDefault();
}
}
public ICollection<Rank> Ranks { get; set; }
}
public class Rank
{
public int Id { get; set; }
public DateTime? Date { get; set; }
}
谢谢,
I suspect that the problem occurs because of line 110
MethodCallExpression orderByCallExpression2 = Expression.Call(
typeof(Queryable),
"OrderByDescending",
new Type[] { typeof(Rank), typeof(DateTime?) },
rank, ***// i suspect the problem is in this line #110***
orderByExp);
不,问题是上面的 Queryable
3 行:
typeof(Queryable),
表达式(成员、方法调用等)的确切类型 rank
是什么并不重要,重要的是该表达式的结果类型是什么(即 Expression.Type
). soldier.Ranks
的类型是 ICollection<Rank>
- 绝对不是 IQueryable<Rank>
,因此例外。
但正如我们所知,ICollection<T>
继承(是)IEnumerable<T>
,因此oldier.Ranks.OrderBy
实际上是调用Enumerable.OrderBy
而不是Queryable.OrderBy
。
话虽如此,只需将上述行中的 Queryable
更改为 Enumerable
即可解决此特定问题。
我希望使用表达式树创建以下 Linq 表达式:
var result2 = soldiers.OrderByDescending(soldier => soldier.Ranks.OrderBy(r=> r.Date).FirstOrDefault().Date).ToArray() ;
问题末尾列出型号
我尝试执行以下操作:
ParameterExpression pe = Expression.Parameter(typeof(Soldier), "soldier");
// e.g soldier.ranks
MemberExpression rank = Expression.Property(pe, "ranks");
ParameterExpression nestedParams = Expression.Parameter(typeof(Rank), "rank");
var dateProperty = typeof(Rank).GetProperty("Date");
// e.g rank.Date
MemberExpression nestedExpression= Expression.MakeMemberAccess(nestedParams, dateProperty);
// e.g rank => rank.date
var orderByExp = Expression.Lambda<Func<Rank, DateTime?>>(nestedExpression, nestedParams);
MethodCallExpression orderByCallExpression2 = Expression.Call(
typeof(Queryable),
"OrderByDescending",
new Type[] { typeof(Rank), typeof(DateTime?) },
rank, ***// i suspect the problem is in this line #110***
orderByExp);
但是发现如下错误:
System.InvalidOperationException: 'No generic method 'OrderByDescending' on type 'System.Linq.Queryable' is compatible with the supplied type arguments and arguments. No type arguments should be provided if the method is non-generic. '
正如我在代码注释中所写,我怀疑问题是由于第 110 行引起的。
我试图在 soldier.ranks
属性 上连接 orderBy 方法。
但也许因为 `soldier.ranks 是 MemberExpression 而不是 MethodCallExpression 或 Queryable,我无法执行该操作。
我将这两个链接用作参考,但可以找到任何与我的问题相似的内容。 * https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/expression-trees/how-to-use-expression-trees-to-build-dynamic-queries
*
型号:
public class Soldier
{
public Rank Rank {
get {
return this.Ranks.OrderByDescending(m => m.Date).FirstOrDefault();
}
}
public ICollection<Rank> Ranks { get; set; }
}
public class Rank
{
public int Id { get; set; }
public DateTime? Date { get; set; }
}
谢谢,
I suspect that the problem occurs because of line 110
MethodCallExpression orderByCallExpression2 = Expression.Call(
typeof(Queryable),
"OrderByDescending",
new Type[] { typeof(Rank), typeof(DateTime?) },
rank, ***// i suspect the problem is in this line #110***
orderByExp);
不,问题是上面的 Queryable
3 行:
typeof(Queryable),
表达式(成员、方法调用等)的确切类型 rank
是什么并不重要,重要的是该表达式的结果类型是什么(即 Expression.Type
). soldier.Ranks
的类型是 ICollection<Rank>
- 绝对不是 IQueryable<Rank>
,因此例外。
但正如我们所知,ICollection<T>
继承(是)IEnumerable<T>
,因此oldier.Ranks.OrderBy
实际上是调用Enumerable.OrderBy
而不是Queryable.OrderBy
。
话虽如此,只需将上述行中的 Queryable
更改为 Enumerable
即可解决此特定问题。