2017-10-16 121 views
0

动态C#表达我有以下对象结构,从给定的列表中选择,包含给定值

public class Client 
{ 
    public Client() 
    { 
     Identifiers = new List<ExternalIdentifier>(); 
    } 

    public Guid? PatientId { get; set; } 
    . 
    . 

    public IList<ExternalIdentifier> Identifiers { get; set; } 
} 

我想建立以下内容的动态表达,

Clients.Where(s=>s.Identifiers.Select(a=>a.Value).ToList().Contains("d"));

这是我到目前为止

public Expression GeneratExp(string consVal) 
{ 
    //TODO be removed .Where(s=>s.Identifiers.Select(a=>a.Value).ToList().Contains("d")); 

    ParameterExpression externalId = Expression.Parameter(typeof(ExternalIdentifier), "id"); 
    Expression idProperty = Expression.PropertyOrField(externalId, "Value"); 

    var valueSelector = Expression.Lambda<Func<ExternalIdentifier, string>>(idProperty, new ParameterExpression[] { externalId }); 

    ParameterExpression client = Expression.Parameter(typeof(Models.Entities.Client), "s"); 
    Expression id = Expression.PropertyOrField(client, "Identifiers"); 

    var selM = typeof(Enumerable).GetMethods().First(x => x.Name == "Select").MakeGenericMethod(typeof(ExternalIdentifier), typeof(string)); 
    var selExpression = Expression.Call(null, selM, id, valueSelector); 

    var toli = typeof(Enumerable).GetMethods().First(x => x.Name == "ToList").MakeGenericMethod(typeof(string)); 
    var toliexp = Expression.Call(null, toli, selExpression); 

    var cont = typeof(Enumerable).GetMethods().First(x => x.Name == "Contains").MakeGenericMethod(typeof(string)); 
    var contexp = Expression.Call(null, cont, toliexp, Expression.Constant("d")); 

    var retcontexp = Expression.Lambda<Func<Models.Entities.Client, bool>>(contexp, Expression.Parameter(typeof(Models.Entities.Client), "s")); 

    return retcontexp; 
} 

when我运行单元测试它建立了以下表达式 s.Identifiers.Select(a => a.Value).ToList()。Contains(“d”)

但自“s”i没有定义,任何帮助建立以下非常赞赏。

S => s.Identifiers.Select(A => a.value中).ToList()。包含( “d”)是非常赞赏

预先感谢。

回答

0

你非常非常接近达到理想的效果。您只需使用相同的​​您的Expression.Lambda<TDelegate>工厂方法的实例参数,您在定义表达式正文时使用该方法。前return改变你的方法的最后一行:

var retcontexp = Expression.Lambda<Func<Client, bool>>(contexp, client); 

...所得拉姆达将是有效的,你就可以编译。

+0

工作就像一个魅力感谢堆! –

相关问题