关于asp.net mvc:在C#中降低lambda查询

lambda query to lower in C#

我在lambda查询中遇到tolower()问题。我有这个密码

1
2
3
4
5
var filterResult = articleList
                        .Where(m => m.Summary
                            .Contains(filteredModel.Keyword) || m.Body.Contains(filteredModel.Keyword) || m.Headline.Contains(filteredModel.Keyword)
                            || m.Title.Contains(filteredModel.Keyword))
                        .AsQueryable();

我需要将tolower()方法添加为sql。例如:

1
2
3
4
5
var filterResult = articleList
    .Where(m => m.Summary.toLower()
        .Contains(filteredModel.Keyword.toLower()) || m.Body.toLower().Contains(filteredModel.Keyword.toLower()) || m.Headline.toLower().Contains(filteredModel.Keyword.toLower())
        || m.Title.toLower().Contains(filteredModel.Keyword.toLower()))
    .AsQueryable();

正如上面的代码,lambda不允许使用。我想知道是否还有其他方法可以做到这一点。


ToLower应该可以工作,试着把它分成不同的行来缩小检查失败的范围——记住,在你真正把结果拉下来之前,它不会执行,例如。

1
2
3
4
5
var keyword = filteredModel.Keyword.ToLower();
var filterResult = articleList.Where(m => m.Summary.ToLowerInvariant().Contains(keyword));
filterResult = filterResult.Where(m => m.Body.ToLower().Contains(keyword));
filterResult = filterResult.Where(m => m.Headline.ToLower().Contains(keyword));
filterResult = filterResult.Where(m => m.Title.ToLower().Contains(keyword));

也只是一个提示-如果您转换为小写以进行文化无关的比较,那么您应该使用tolowerinvariant…或者更好地使用toupperinvariant,因为它更可靠。


你也可以用

1
2
3
4
    .Where(m => m.Summary.IndexOf(filteredModel.Keyword, StringComparison.OrdinalIgnoreCase) >= 0
       || m.Body.IndexOf(filteredModel.Keyword, StringComparison.OrdinalIgnoreCase) >= 0
       || m.Headline.IndexOf(filteredModel.Keyword, StringComparison.OrdinalIgnoreCase) >= 0
       || m.Title.IndexOf(filteredModel.Keyword, StringComparison.OrdinalIgnoreCase) >= 0

我认为应该得到你的LINQ供应商的支持

通过创建一个扩展方法,您可以像这里描述的那样更整洁。

1
2
3
public static bool Contains(this string source, string toCheck, StringComparison comp) {
  return source.IndexOf(toCheck, comp) >= 0;
}

所以你可以这样做

1
2
3
4
.Where(m => m.Summary.Contains(filteredModel.Keyword, StringComparison.OrdinalIgnoreCase)
           || m.Body.Contains(filteredModel.Keyword, StringComparison.OrdinalIgnoreCase)
           || m.Headline.Contains(filteredModel.Keyword, StringComparison.OrdinalIgnoreCase)
           || m.Title.Contains(filteredModel.Keyword, StringComparison.OrdinalIgnoreCase)