Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从c#表达式中的属性调用属性?_C#_Expression - Fatal编程技术网

如何从c#表达式中的属性调用属性?

如何从c#表达式中的属性调用属性?,c#,expression,C#,Expression,我有三节课 AutoYearMake{ int Year { get; set; } string Make { get; set; } } AutoModel{ IAutoYearMake AutoYearMakeParent { get; set; } string Model { get; set; } } AutoTrim{ IAutoMo

我有三节课

    AutoYearMake{
       int Year { get; set; }
       string Make { get; set; }
            }

    AutoModel{
       IAutoYearMake AutoYearMakeParent { get; set; }
       string Model { get; set; }
            } 

    AutoTrim{
        IAutoModel AutoModelParent { get; set; }
        string Trim { get; set; }
            }
我需要创建一个数据库查询。如何动态获取表达式,如:

   Expression<Func<AutoTrim, bool>> expression =  expression = t => t.AutoModelParent.AutoYearMakeParent.Year == year.Value
                              && t.AutoModelParent.AutoYearMakeParent.Make 
                              == make && t.AutoModelParent.Model == model; 

我如何解决这个问题?我试着用Expression.Call。这不是正确的方法。

Expression.Property()方法的第一个参数是应该从中访问属性的对象。如果要从参数
t
访问属性
AutoModelParent
,请使用:

Expression.Property(parameter, "AutoModelParent")
因此,如果要访问参数t的AutoModelParent属性的Model属性,可以使用:

Expression.Property(Expression.Property(parameter, "AutoModelParent"), "Model")

考虑这个解决方案:

private static MemberExpression GetPropertyPathAccessor(Expression parameter, string path)
{
    return (MemberExpression) path.Split('.').Aggregate(parameter, Expression.Property);
}
或者如果你不喜欢一句台词

private static MemberExpression GetPropertyPathAccessor(Expression parameter, string path)
{
    Expression current = parameter;
    foreach (var propertyName in path.Split('.'))
    {
        current = Expression.Property(current, propertyName);
    }
    return (MemberExpression)current;
}
然后您可以使用:

MemberExpression yearProp = GetPropertyPathAccessor(parameter, "AutoModelParent.AutoYearMakeParent.Year");
这个怎么样

之后,在expFunc中有Func,您可以立即使用它

var argParam = Expression.Parameter(typeof(AutoTrim), "s");
var expFunc = Expression.Lambda<Func<AutoTrim, bool>>(
        Expression.AndAlso(
            Expression.AndAlso(
                Expression.Equal(
                    Expression.Property(Expression.Property(Expression.Property(argParam, "AutoModelParent"), "AutoYearMakeParent"), "Year"), 
                    Expression.Constant(year.Value)),
                Expression.Equal(
                    Expression.Property(Expression.Property(Expression.Property(argParam, "AutoModelParent"), "AutoYearMakeParent"), "Make"),
                    Expression.Constant(make))
            ),
            Expression.Equal(
                Expression.Property(Expression.Property(argParam, "AutoModelParent"), "Model"), 
                Expression.Constant(model))
        ),
        argParam
    ).Compile();

查看表达式
表达式
并查看其结构。
var argParam = Expression.Parameter(typeof(AutoTrim), "s");
var expFunc = Expression.Lambda<Func<AutoTrim, bool>>(
        Expression.AndAlso(
            Expression.AndAlso(
                Expression.Equal(
                    Expression.Property(Expression.Property(Expression.Property(argParam, "AutoModelParent"), "AutoYearMakeParent"), "Year"), 
                    Expression.Constant(year.Value)),
                Expression.Equal(
                    Expression.Property(Expression.Property(Expression.Property(argParam, "AutoModelParent"), "AutoYearMakeParent"), "Make"),
                    Expression.Constant(make))
            ),
            Expression.Equal(
                Expression.Property(Expression.Property(argParam, "AutoModelParent"), "Model"), 
                Expression.Constant(model))
        ),
        argParam
    ).Compile();
int? year = 2000;
string make = "BMW";
string model = "6";