C# 带“的表达式;其中;方法调用

C# 带“的表达式;其中;方法调用,c#,entity-framework,system.reflection,C#,Entity Framework,System.reflection,我正在尝试实现这种表达式:“A=>A.B.Where(extExp).Count()>0”,并且我遇到了如何为Where(…)生成表达式的问题,正如我假设的ICollection的扩展方法一样。有人能帮忙吗 Expression<Func<N, bool>> conditions = c => c.T_ID == 1 || c.T_ID == 2; ParameterExpression mpe = Expression.Parameter(typeof(T), "

我正在尝试实现这种表达式:“A=>A.B.Where(extExp).Count()>0”,并且我遇到了如何为Where(…)生成表达式的问题,正如我假设的ICollection的扩展方法一样。有人能帮忙吗

Expression<Func<N, bool>> conditions = c => c.T_ID == 1 || c.T_ID == 2;
ParameterExpression mpe = Expression.Parameter(typeof(T), "A");
Expression prop = Expression.Property(mpe,typeof(T).GetProperty("B"));
...
var propWhere = Expression.Call(..., prop, conditions);
Expression conditions=c=>c.T_ID==1 | | c.T_ID==2;
ParameterExpression mpe=表达式。参数(类型(T),“A”);
Expression prop=Expression.Property(mpe,typeof(T).GetProperty(“B”);
...
var propWhere=Expression.Call(…,prop,conditions);

如何正确地调用它

这里有一个重载调用,它使用MethodInfo。要获得方法信息,我认为最好使用此答案中的代码-

publicstaticmethodinfo GetMethodInfo(表达式)
{
var member=expression.Body作为MethodCallExpression;
如果(成员!=null)
返回成员。方法;
抛出新ArgumentException(“表达式不是方法”、“表达式”);
}
用法

var whereMethodInfo=GetMethodInfo(()=>Enumerable.Where(Enumerable.Empty(),i=>true));
顺便说一句,我建议您下载LINQPad并使用它编写查询,查看生成的表达式树和IL代码

public static MethodInfo GetMethodInfo(Expression<Action> expression)
{
    var member = expression.Body as MethodCallExpression;

    if (member != null)
        return member.Method;

    throw new ArgumentException("Expression is not a method", "expression");
}
var whereMethodInfo = GetMethodInfo(() => Enumerable.Where(Enumerable.Empty<T>(), i=>true));