如何生产使用非通用拉姆达
问题描述:
你会如何翻译以下通用lambda函数为lambda表达式子查询:如何生产使用非通用拉姆达
context.AssociateWith<Product>(p => p.Regions.Where(r => r.Country == 'Canada')
我想没有任何<T>
或直接调用创建一个完整的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
部分从那里......
答
试试这个,这是不漂亮,但它给你一个有效的表达整个结构。你可以将内部lambda定义为一个表达式,但是在将它传递给Where()
之前,你仍然需要编译它,所以出于这个答案的目的,它似乎是多余的。
Expression<Func<Product, IEnumerable<Region>>> getRegions =
p => p.Regions.Where(r => r.Country == "Canada");
答
我知道我很晚才与我的回答的游戏,可能这是不是你正在寻找(仍然使用频繁)的精确解,但也许它会帮助你和其他人建立他们的表达:
/*
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<Func<MyInnerClass, bool>>(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<Func<MyOuterClass, bool>>(outerMethodExpression, outerItem);
query = query.Where(outerLambda);
根据这里发布的答案:Creating a Linq expression dynamically containing a subquery。
我更关注将使用非键入参数的东西。我会更精确地提出我的问题。 Thanx tho! – Mathlec 2009-09-29 00:32:02