C#,动态linq错误无适用方法';包含';存在于类型'中;字符串';

C#,动态linq错误无适用方法';包含';存在于类型'中;字符串';,c#,linq,dynamic-linq,C#,Linq,Dynamic Linq,我有一个这样的对象列表(我使用的是.NET3.5) 使用动态Linq,这也可以按预期工作 var tmp = test .Select(p => p.Name) .Where(x => x.ToString().Contains("One", StringComparison.InvariantCultureIgnoreCase)) ; var dtmp = test.AsQueryable() .Select(p => p.Name)

我有一个这样的对象列表(我使用的是.NET3.5)

使用动态Linq,这也可以按预期工作

var tmp = test
    .Select(p => p.Name)
    .Where(x => x.ToString().Contains("One", StringComparison.InvariantCultureIgnoreCase))
    ;
var dtmp = test.AsQueryable()
    .Select(p => p.Name)
    .Where("ToString().Contains(@0)", "one")
    ;
然而,当尝试区分用例时,动态测试失败

var dtmp2 = test.AsQueryable()
    .Select(p => p.Name)
    .Where("ToString().Contains(@0, @1)", "one", StringComparison.InvariantCultureIgnoreCase)
    ;
错误是

No applicable method 'Contains' exists in type 'String'
我的第一次尝试是编写这样的Contains()扩展

public static bool Contains(this string source, string toCheck, StringComparison comp)
{
    return source.IndexOf(toCheck, comp) >= 0;
}
动态Linq似乎不知道我的扩展。我发现(根据这个)

动态Linq不能很容易地使用(静态)扩展

因此,要么:

  • 普通方法中的变换扩展。但是,如何对每个ToString()执行此操作,是否有可能或者应该在MyObject中编写一个方法,然后对特定对象使用linq

  • 修改动态库代码以接受硬编码(my)静态扩展

  • 其他建议

  • 注意:我可以使用一个简单的if/else来表示区分大小写的两个动态,但我更喜欢用动态方式来解决问题,因为我的应用程序使用了一些复杂的过滤


    提前感谢您,

    如果您的应用程序需要动态筛选功能,我建议让调用者传递谓词

    这允许分离关注点并简化单元测试

    另外,当调用方传递谓词时,不需要IF/ELSE语句

    var predicate = new Predicate<string>(str => str.Contains("one"));
    
    var tmp = test.Select(p => p.Name).Where(predicate);
    
    var谓词=新谓词(str=>str.Contains(“一”);
    var tmp=test.Select(p=>p.Name).Where(谓词);
    
    您是否尝试使用,因为这个库似乎可以处理您的示例c#代码。

    嗯。。我懂了。加上谓词生成器。但是我仍然必须使用IF/ELSE作为区分大小写的选项。@orfruit谓词可以使用
    Contains
    扩展方法和
    stringcomparison
    。调用方负责创建返回正确结果的谓词。在我看来,在不检查代码的情况下,应该不需要IF/ELSE。我现在正在研究(实际上已放弃)谓词解决方案。我有一个搜索表单,它有一个组合(StartsWith、EndsWith、Equals和Contains)和一个区分大小写的复选框。谢谢你的支持!
    var predicate = new Predicate<string>(str => str.Contains("one"));
    
    var tmp = test.Select(p => p.Name).Where(predicate);