C# 带表达式树的Linq子选择

C# 带表达式树的Linq子选择,c#,linq,expression-trees,C#,Linq,Expression Trees,我有一个带有子选择的Linq语句: query1 = from d in drivers where d.Klasse == 3 && cars.Where(c => c.Driver == d.Name && c.Power == 120).Count() > 0 select d; 这个很好用。现在我想对表达式树做同样的处理 这就是我目前掌握的 ParameterExpression peCar = Exp

我有一个带有子选择的Linq语句:

query1 = from d in drivers 
         where d.Klasse == 3 && cars.Where(c => c.Driver == d.Name && c.Power == 120).Count() > 0 
         select d;
这个很好用。现在我想对表达式树做同样的处理

这就是我目前掌握的

ParameterExpression peCar = Expression.Parameter(typeof(Car), "c");
ParameterExpression peDriver = Expression.Parameter(typeof(Driver), "d");
Expression eKlasse = Expression.Property(peDriver, "Klasse");
Expression ePower = Expression.Property(peCar, "Power");
Expression eDriver = Expression.Property(peCar, "Driver");
Expression eName = Expression.Property(peDriver, "Name");

Expression eEx1 = Expression.Equal(eKlasse, Expression.Constant(3, typeof(int)));
Expression eEx2 = Expression.Equal(eDriver, eName);
Expression eEx3 = Expression.Equal(ePower, Expression.Constant(120, typeof(int)));
Expression eEx4 = Expression.And(eEx2, eEx3);

Expression<Func<Car, bool>> whereConditionSub = Expression.Lambda<Func<Car, bool>>(eEx4, new ParameterExpression[] { peCar });

Expression eSub1 = (Expression)cars.AsQueryable<Car>().Where(whereConditionSub).Count();
Expression eSub2 = Expression.GreaterThan(eSub1, Expression.Constant(0, typeof(int)));
Expression eEx5 = Expression.And(eEx1, eSub2);

Expression<Func<Driver, bool>> whereCondition = Expression.Lambda<Func<Driver, bool>>(eEx5, new ParameterExpression[] { peDriver });

query1 = drivers.AsQueryable<Driver>().Where(whereCondition);
ParameterExpression peCar=Expression.Parameter(typeof(Car),“c”);
ParameterExpression peDriver=表达式参数(类型(驱动程序),“d”);
表达式eKlasse=Expression.Property(peDriver,“Klasse”);
表达式ePower=Expression.Property(peCar,Power);
表达式eDriver=Expression.Property(peCar,Driver);
表达式eName=Expression.Property(peDriver,“Name”);
表达式eEx1=表达式.Equal(eClass,表达式.Constant(3,typeof(int)));
表达式eEx2=表达式.Equal(eDriver,eName);
表达式eEx3=表达式.Equal(ePower,表达式.Constant(120,typeof(int));
表达式eEx4=表达式和(eEx2,eEx3);
表达式whereConditionSub=Expression.Lambda(eEx4,新参数Expression[]{peCar});
表达式eSub1=(表达式)cars.AsQueryable().Where(whereConditionSub.Count();
表达式eSub2=Expression.GreaterThan(eSub1,Expression.Constant(0,typeof(int));
表达式eEx5=表达式和(eEx1,eSub2);
表达式whereCondition=Expression.Lambda(eEx5,新参数Expression[]{peDriver});
query1=drivers.AsQueryable().Where(whereCondition);
但我一直在研究如何将子查询作为表达式放入主查询中

Expression eSub1 = (Expression)cars.AsQueryable<Car>().Where(whereConditionSub).Count();
表达式eSub1=(表达式)cars.AsQueryable().Where(whereConditionSub.Count();

你知道怎么做吗?这可能吗?

哇,这似乎有很多不可读的代码。我不确定你为什么想要这样的东西,但无论如何。。。 不能对表达式强制转换int,因为它不起作用。Count向您传递结果,因此它执行表达式。您需要先捕获表达式,然后将计数作为方法调用添加到顶部。 比如:

var whereExp = cars.AsQueryable<Car>().Where(whereConditionSub).Expression;
var countMethod = new Func<IQueryable<Car>, int>(Queryable.Count).Method;
var eSub1 = Expression.Call(countMethod, whereExp);
var whereExp=cars.AsQueryable().Where(whereConditionSub).Expression;
var countMethod=新函数(Queryable.Count).Method;
var eSub1=Expression.Call(countMethod,whereExp);

您使用的是哪种LINQ提供程序?LINQ到对象?LINQ到实体?还有什么吗?在这个例子中,我使用Linq来创建对象。但我也有需要使用LINQtoSQL进行动态子选择的情况。