【问题标题】:C# Expression String.IndexOf case insensitive with the property selectorC# Expression String.IndexOf 属性选择器不区分大小写
【发布时间】:2019-01-18 22:16:14
【问题描述】:

我有以下类和扩展方法来调用String.Contains 方法。如何将其更改为不区分大小写?类似于Expression tree for String.IndexOf method 的东西,但到目前为止我还没有想法如何将该代码调整到我的代码中。有什么帮助吗?

public class testItem
{
    public string SomeProperty { get; set; }
}

public static IQueryable<testItem> PropertyContainsNEW<testItem>(this IQueryable<testItem> source,
                                                                Expression<Func<testItem, string>> selector,
                                                                string value)
{
    ParameterExpression parameter = Expression.Parameter(typeof(testItem), "x");
    Expression property = Expression.Property(parameter, ((MemberExpression)selector.Body).Member.Name);
    var search = Expression.Constant(value, typeof(string));

    MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
    var containsMethodExp = Expression.Call(property, method, search);

    var predicate = Expression.Lambda<Func<testItem, bool>>(containsMethodExp, parameter);

    return source.Where(predicate);
}

【问题讨论】:

  • 您希望在结果查询执行中不区分大小写?如果是这样,您的问题还不清楚。
  • 是的,我提供集合,选择一个属性并提供一个要比较的字符串
  • referencesource.microsoft.com/#mscorlib/system/string.cs,2172 为什么你需要 Contains 而不是仅仅使用 IndexOf 来达到你的目的?
  • 区分大小写通常是数据库实例设置。例如,Sql Server 在安装过程中默认使用不区分大小写的排序规则。
  • @AlexandruClonțea 这就是重点,我需要在这里使用 IndexOf 和 StringComparison.OrdinalIgnoreCase 选项

标签: c#


【解决方案1】:

为了使用StringComparison参数,您需要正确识别该方法。

这是你需要的吗?:

public static IQueryable<testItem> PropertyContainsNEW(this IQueryable<testItem> source,
        Expression<Func<testItem, string>> selector,
        string value)
{
   var parameter = Expression.Parameter(typeof(testItem), "x");
   var property = Expression.Property(parameter, ((MemberExpression)selector.Body).Member.Name);
   var search = Expression.Constant(value, typeof(string));

   var parms = new Expression[] { search,
            Expression.Constant(StringComparison.OrdinalIgnoreCase) };

   var method = typeof(string).GetMethod("Contains", new[] { typeof(string), typeof(StringComparison) });
   var containsMethodExp = Expression.Call(property, method, parms);

   var predicate = Expression.Lambda<Func<testItem, bool>>(containsMethodExp, parameter);

   return source.Where(predicate);
}

【讨论】:

    猜你喜欢
    • 2011-08-05
    • 2013-10-28
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    相关资源
    最近更新 更多