2015-06-10 53 views
0

我想要建立一個動態的表達式來使用對象列表。動態在LINQ中使用表達式

var list = new List<Dummy>(); 
IQueryable<Dummy> queryableData = list.AsQueryable<Dummy>(); 
MethodCallExpression wherExpression = 
       Expression.Call(typeof(Queryable), 
           "Where", 
           new Type[] { typeof(Dummy) }, 
           queryableData.Expression, 
           Expression.Lambda<Func<Dummy, bool>>(lambda.Body, lambda.Parameters.First())); 

更新:lambda.Body

lambda.Body = {(((x.Title.Contains("Mihai") Or x.Description.Contains("Mihai")) Or x.Comments.Contains("Mihai")) Or x.User.Contains("Mihai"))}

,然後調用其中的表達,如:

var result = queryableData.Provider.CreateQuery<Dummy>(wherExpression).ToList(); 

where子句正確構建,這是結果

{System.Collections.Generic.List`1[P.Dummy].Where(x => (((x.Title.Contains("Foo") Or x.Description.Contains("Foo")) Or x.Comments.Contains("Foo")) Or x.User.Contains("Foo")))} 

當我嘗試可以調用其中的表情,我得到

var result = queryableData.Provider.CreateQuery<Dummy>(wherExpression).ToList(); 
variable 'x' of type 'P.Dummy' referenced from scope '', but it is not defined 

你有任何想法,爲什麼,你能不能幫我解決這個問題?

更新 這是表達的是如何構建的:

var type = typeof(T); 
var lambdaList = new List<Expression<Func<T, bool>>>(); 
foreach (var prop in type.GetProperties()) 
{ 
    if (prop.PropertyType == typeof(string)) 
    { 
     ParameterExpression parameter = Expression.Parameter(type, "x");//{x} 
     Expression expression = parameter; 

     PropertyInfo pi = type.GetProperty(prop.Name);//Property 
       expression = Expression.Property(expression, pi);//{x.Property} 

     var containsFunc = Expression.Call(expression, 
        typeof(string).GetMethod("Contains"), 
        new Expression[] { Expression.Constant("Mihai") }); 
       Expression<Func<T, bool>> lambda = Expression.Lambda<Func<T, bool>>(containsFunc, parameter); 
       lambdaList.Add(lambda); 

    } 
} 
Expression<Func<T, bool>> finalExpression = lambdaList.First(); 

foreach (Expression<Func<T, bool>> expression in lambdaList.Skip(1)) 
{ 
    finalExpression = finalExpression.Or(expression); 
} 
+0

是不是有一個原因,你不只是調用'Where'並只傳遞內部表達式?在任何情況下,展開lambda表達式比使用相同的主體和參數稍微複雜一些。:)你究竟做了什麼?它想要做什麼? – Luaan

+0

我對內部表達式沒有任何控制權。我爲具有字符串屬性的不同對象動態構建它。在我有了表達式之後,我需要將它應用到相同類型對象的列表以及用於構造表達式的列表。 –

+0

好的,你已經有了內心的表達。只需調用'queryableData.Where(theInnerExpression)',你就完成了:) – Luaan

回答

1

評論的副本:

我收到了你的問題。您爲每個屬性創建一個新的ParameterExpression。他們都稱爲x,但它們是不同的實例。只創建一個名爲x的ParameterExpression,然後遍歷所有屬性。

+0

再次感謝您的幫助:) @維拉皮 –