gpt4 book ai didi

c# - 在 MemberExpression 上连接一个 MethodCallExpression

转载 作者:行者123 更新时间:2023-11-30 21:30:01 30 4
gpt4 key购买 nike

我希望使用表达式树创建以下 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://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/expression-trees/how-to-use-expression-trees-to-build-dynamic-queries

* https://stackoverflow.com/a/11337472/10950549

模型:

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> ,因此异常(exception)。

但据我们所知,ICollection<T>继承(是)IEnumerable<T> ,因此 oldier.Ranks.OrderBy实际上是调用Enumerable.OrderBy而不是 Queryable.OrderBy .

话虽这么说,只需更改 QueryableEnumerable在上述行中,这个特定问题将得到解决。

关于c# - 在 MemberExpression 上连接一个 MethodCallExpression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54873870/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com