2017-09-12 36 views
1

我創建一個通用凡過濾器(在Contains過濾器只關心)的偉大工程至今:動態凡通過導航篩選器屬性

private static MethodInfo contains = typeof(string).GetMethod("Contains"); 
private static Expression<Func<T, bool>> GetFilter<T>(string propertyName, string value) 
{ 
    var item = Expression.Parameter(typeof(T), "item"); 
    var member = Expression.Property(item, propertyName); 
    var constant = Expression.Constant(value); 
    var body = Expression.Call(member, contains, constant); 

    return Expression.Lambda<Func<T, bool>>(body, item); 
} 

有沒有什麼辦法讓我可以搜索我可以延長這個由導航屬性?我很新使用Expression,所以我不確定要嘗試什麼。

一個例子是:

public class A 
{ 
    public int BId { get; set; } 
    public B B { get; set; } 
} 

public class B 
{ 
    public string Name { get; set; } 
} 

dbContext.As 
    .Where(GetFilter<A>("B.Name", "Hello World")) 
    .ToList(); 

但這未能對Expression.Property("B.Name")有:

Instance屬性B.Name沒有爲類型A

+0

您將獲得所有你從https://github.com/kahanu/System.Linq.Dynamic/blob/master/Src/System.Linq.Dynamic/DynamicLinq.cs – haim770

回答

3

定義您需要創建每個成員按順序訪問屬性路徑中的每個屬性:

private static Expression<Func<T, bool>> GetFilter<T>(string propertyName, string value) 
{ 
    var item = Expression.Parameter(typeof(T), "item"); 

    Expression member = item; 
    foreach (var prop in propertyName.Split('.')) 
    { 
     member = Expression.Property(member, prop); 
    } 

    var constant = Expression.Constant(value); 
    var body = Expression.Call(member, contains, constant); 

    return Expression.Lambda<Func<T, bool>>(body, item); 
} 
+0

@CamiloTerevinto高興需要的知識幫助:)不要忘記標記爲已回答:) –