0

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

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。例如:

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 不允许使用。我想知道是否有其他方法可以做到这一点。

4

2 回答 2

0

你可以达到同样的效果

    .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 提供商的支持

您可以通过创建扩展方法来使这个更整洁,如此处所述

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

所以你可以这样做

.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) 
于 2012-08-08T14:48:27.680 回答
0

ToLower应该可以工作,尝试将其分成不同的行以缩小检查失败的范围 - 请记住它不会执行,直到您实际将结果拉下来,例如

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));

Also just an FYI - if your converting to lower case for culture-independant comparison then you should be using ToLowerInvariant...or better yet using ToUpperInvariant as it's more reliable.

于 2012-08-08T14:50:30.013 回答