Integer 包含 linq c# 但使用 using 表达式

Integer contains linq c# but using using expressions

我想使用 linq 表达式为我的存储库创建一个动态过滤器,我有其他过滤器,但我不知道如何使用表达式创建下一个过滤器:(条件取自 here

var result = _studentRepotory.GetAll().Where(s => 
SqlFunctions.StringConvert((double)s.Id).Contains("91")).ToList();

我有一个方法接收 属性 的值、属性Name 和过滤器运算符类型(枚举):

public static class Helper {
    public static Expression<Func<T, bool>> GetExpression<T>(object value, string propertyName, FilterOperatorType FilterType)
    {
        var parameter = Expression.Parameter(typeof(T));
        var property = ExpressionUtils.GetPropertyChild(parameter, propertyName);
        var constValue = Expression.Constant(value);

        BinaryExpression expresion = null;
        switch (FilterType)
        {
            case FilterOperatorType.Equal:
                expresion = Expression.Equal(property, constValue);
                break;
            case FilterOperatorType.Greater:
                expresion = Expression.GreaterThan(property, constValue);
                break;
            case FilterOperatorType.Less:
                expresion = Expression.LessThan(property, constValue);
                break;
            case FilterOperatorType.GreaterOrEqual:
                expresion = Expression.GreaterThanOrEqual(property, constValue);
                break;
            case FilterOperatorType.LessOrEqual:
                expresion = Expression.LessThanOrEqual(property, constValue);
                break;
        }

        var lambda = Expression.Lambda<Func<T, bool>>(expresion, parameter);
        return lambda;
    }
}

所以,我想添加一个新的运算符类型 Contains,它将评估一个整数是否包含一些数字,在我执行的第一段代码中,但我想使用泛型通过 linq 表达式来完成。

最后我会得到:

Expression<Func<Student, bool>> where = Helper.GetExpression<Student>("91", "Id",  FilterOperatorType.Contains);
var result = _studentRepotory.GetAll().Where(where).ToList();

查询应该return Id 包含数字91 的所有学生。

请帮助我,如果你明白了告诉我。

我现在 2:00 还在研究这个,那个时候大脑运转得更好嘿嘿嘿,这里是创建表达式的解决方案:

object value = "91";

var parameter = Expression.Parameter(typeof(Student));
var property = ExpressionUtils.GetPropertyChild(parameter, "Id");
var constValue = Expression.Constant(value);

var expressionConvert = Expression.Convert(property, typeof(double?));

var methodStringConvert = typeof(SqlFunctions).GetMethod("StringConvert",
                    BindingFlags.Public | BindingFlags.Static, null,
                    CallingConventions.Any,
                    new Type[] { typeof(double?) },
                    null);

var methodContains = typeof(string).GetMethod("Contains", 
            BindingFlags.Public | BindingFlags.Instance,
            null, CallingConventions.Any,
            new Type[] { typeof(String) }, null);

var expresionStringConvert = Expression.Call(methodStringConvert, expressionConvert);
var expresionContains = Expression.Call(expresionStringConvert, methodContains, constValue);
var lambdaContains = Expression.Lambda<Func<Student, bool>>(expresionContains, parameter);

现在您可以在 studentRepository 的 Where 方法中使用 lambdaContains

这是一个方法。您可以将 int 列搜索为字符串

https://gist.github.com/gnncl/e424adefc3e08b607beee8d638759492