2009-09-28 20 views
0

你會如何翻譯以下通用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部分從那裏......

回答

0

試試這個,這是不漂亮,但它給你一個有效的表達整個結構。你可以將內部lambda定義爲一個表達式,但是在將它傳遞給Where()之前,你仍然需要編譯它,所以出於這個答案的目的,它似乎是多餘的。

Expression<Func<Product, IEnumerable<Region>>> getRegions = 
     p => p.Regions.Where(r => r.Country == "Canada"); 
+0

我更關注將使用非鍵入參數的東西。我會更精確地提出我的問題。 Thanx tho! – Mathlec 2009-09-29 00:32:02

2

我知道我很晚才與我的回答的遊戲,可能這是不是你正在尋找(仍然使用頻繁)的精確解,但也許它會幫助你和其他人建立他們的表達:

/* 
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