C#,动态linq错误无适用方法';包含';存在于类型'中;字符串';
我有一个这样的对象列表(我使用的是.NET3.5) 使用动态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)
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不能很容易地使用(静态)扩展
因此,要么:
提前感谢您,如果您的应用程序需要动态筛选功能,我建议让调用者传递谓词 这允许分离关注点并简化单元测试 另外,当调用方传递谓词时,不需要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);