将params args转换为Entity Framework中的lambda表达式

时间:2017-04-27 12:51:44

标签: c# entity-framework lambda parameters where-clause

我希望使用params string [] args并将其转换为Entity Framework的lambda表达式。

像这样......

public main(params string[] args)
{
    DataContext context = new DataContext();

    foreach(string arg in args)
    {
        //build Query
    }

    context.Things.Where(/*Query*/);
}

2 个答案:

答案 0 :(得分:0)

您可以使用动态linq创建基于字符串的表达式。 https://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library

缺点是这些表达式是在运行时进行评估的,因此您无法在编译时捕获错误。

或者您可以使用表达式树来构造表达式。 https://msdn.microsoft.com/en-us/library/bb882637(v=vs.110).aspx

这将是更多代码,但您将获得编译时类型检查的优势。

答案 1 :(得分:0)

这里有一篇优秀的文章https://www.codeproject.com/Articles/1079028/Build-Lambda-Expressions-Dynamically

这是我的解决方案:

public static Expression<Func<TClass, bool>> ConvertParamArgsToExpression<TClass>(string[] args)
{
    Expression finalExpression = Expression.Constant(true);

    var parameter = Expression.Parameter(typeof(TClass), "x");

    foreach (string arg in args) {
        string[] values = arg.Split('=');
        PropertyInfo prop = typeof(TClass).GetProperty(values[0]);
        if(prop != null)
        {
            Expression expression = null;
            var member = Expression.Property(parameter, prop.Name);
            var constant = Expression.Constant(values[1]);

            expression = Expression.Equal(member, constant);

            finalExpression = Expression.AndAlso(finalExpression, expression);
        }
    }

    return (Expression.Lambda<Func<TClass, bool>>(finalExpression, parameter));
}

用法:

    Expression<Func<AdminPageObject, bool>> expression = LambdaConverter.ConvertParamArgsToExpression<AdminPageObject>(args);
    if(expression != null)
    {
        items = items.Where(expression);
    }