如何使用非genericsLambda生成子查询

您如何将以下通用Lambda函数转换为lambda表达式:

context.AssociateWith(p => p.Regions.Where(r => r.Country == 'Canada') 

我正在尝试创建一个完整的lambda表达式,没有任何或直接调用。 就像是 :

 void AddFilter(ITable table, MetaDataMember relation) { var tableParam = Expression.Parameter(table.ElementType, "e"); var prop = Expression.Property(tableParam, relation.Name); var func = typeof(Func).MakeGenericType(table.ElementType, relation.type) var exp = Expression.Lambda(func, prop, tableParam); } 

这将产生e.Regions ……但我无法从那里获得Where部分……

我知道我在游戏中已经很晚了,我的回答很可能这不是您正在寻找的确切解决方案(仍然经常使用),但也许它会帮助您和其他人建立他们的表达:

 /* example: Session.Query.Where(m => m.Regions.Where(f => f.Name.Equals("test"))) */ var innerItem = Expression.Parameter(typeof(MyInnerClass), "f"); var innerProperty = Expression.Property(innerItem, "Name"); var innerMethod = typeof(string).GetMethod("Equals", new[] { typeof(string) }); var innerSearchExpression = Expression.Constant(searchString, typeof(string)); var innerMethodExpression = Expression.Call(innerProperty, innerMethod, new[] { innerSearchExpression }); var innerLambda = Expression.Lambda>(innerMethodExpression, innerItem); var outerItem = Expression.Parameter(typeof(MyOuterClass), "m"); var outerProperty = Expression.Property(outerItem, info.Name); /* calling a method extension defined in Enumerable */ var outerMethodExpression = Expression.Call(typeof(Enumerable), "Where", new[] { typeof(MyInnerClass) }, outerProperty, innerLambda); var outerLambda = Expression.Lambda>(outerMethodExpression, outerItem); query = query.Where(outerLambda); 

基于此处发布的答案: 动态创建包含子查询的Linq表达式 。

试试这个,它并不漂亮,但它为你提供了整个结构的有效表达式。 您可以将内部lambda定义为表达式,但在将其传递给Where()之前,您仍然需要编译它,因此对于此答案而言,它似乎是多余的。

 Expression>> getRegions = p => p.Regions.Where(r => r.Country == "Canada");