c# – 如何在Dynamic LINQ中使用Contains时动态键入Cast到字符串?

我想使用动态LINQ查询来搜索类中所有属性中的一些文本.我正在使用以下函数来创建表达式.我正在将属性名称和搜索文本传递给方法.

 在该方法中,如果属性类型是String,那么它工作正常.如果属性类型是int,DateTime,GUID.那它不起作用.

我们知道仅包含元素数组或字符串的方法.我认为属性的值应该输入到字符串.那怎么办呢?解释与解释是完整的帮助.

我收集了this的代码.

   public static Expression<Func<T, bool>> ContainsExp<T>(string propertyName, string contains)
    {
        var parameterExp = Expression.Parameter(typeof(T), "type");
        var propertyExp = Expression.Property(parameterExp, propertyName);

      MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });


        var someValue = Expression.Constant(contains, typeof(string));
        var containsMethodExp = Expression.Call(propertyExp, method, someValue);

        return Expression.Lambda<Func<T, bool>>(containsMethodExp, parameterExp);

    }

最佳答案 好吧,你可能知道在linq中对实体使用ToString()是不可能的.

所以以下问题是:如何将其他类型转换为字符串.

对于数值,你有SqlFunctions.StringConvert,但它只有double的重载?和十进制?

对于DateTime,你可以在你的DateTime上应用SqlFunctions.DatePart后找到一些使用SqlFunctions.StringConvert的东西(这可能意味着至少3次调用SqlFunctions.DatePart,年,月,日)

对于Guid,我认为没有办法直接做到这一点.一种方法(在db级别,如果你使用Sql Server)可能是一个Computed列.计算列可以存储GUID的varchar转换表示.也许有更好的方法.

无论如何,这里至少有一个样本应该适用于整数和字符串:

 public static Expression<Func<T, bool>> ContainsExp<T>(string propertyName, string contains)
        {

            //first, get the type of your property
            var propertyType = typeof(T).GetProperty(propertyName).PropertyType;
            //no change
            var parameterExp = Expression.Parameter(typeof (T), "type");
            Expression propertyExp = Expression.Property(parameterExp, propertyName);
            //if property's type is int
            if (propertyType == typeof (int))
            {
                //convert your Expression to a nullable double (or nullable decimal),
                //so that you can use SqlFunctions.StringConvert
                propertyExp = Expression.Convert(propertyExp, typeof (double?));
                //get the SqlFunctions.StringConvert method for nullable double
                var stringConvertMethod = typeof (SqlFunctions).GetMethod("StringConvert", new[] {typeof (double?)});
                //call StringConvert on your converted expression
                propertyExp = Expression.Call(stringConvertMethod , propertyExp);
            }
            //no change
            var method = typeof (string).GetMethod("Contains", new[] {typeof (string)});


            var someValue = Expression.Constant(contains, typeof (string));
            var containsMethodExp = Expression.Call(propertyExp, method, someValue);

            return Expression.Lambda<Func<T, bool>>(containsMethodExp, parameterExp);

        }
点赞