LINQ to Entities包含区分大小写的搜索

Dot*_*mer 13 c# linq asp.net linq-to-entities

我试图在linq中查询我的结果集到实体;

var categoriesList = _catRepo.GetAllCategories();


 filteredCategories = categoriesList.Where(c=> c.CategoryName.Contains("for"));
Run Code Online (Sandbox Code Playgroud)

但是,我没有得到任何结果监守的CategoryNameFor(Upper Case)在数据库中.我还检查了sql server collat​​ion,并将其设置为_CI_AS.我不知道如何使用contains来过滤不区分大小写的字符串? 如果有人打字,我基本上想要;

 filteredCategories = categoriesList.Where(c=> c.CategoryName.Contains("for"));
Run Code Online (Sandbox Code Playgroud)

要么

filteredCategories = categoriesList.Where(c=> c.CategoryName.Contains("For"));
Run Code Online (Sandbox Code Playgroud)

结果应该是一样的

Shy*_*mep 18

试试这个

filteredCategories = categoriesList.Where(c=>
 c.CategoryName.IndexOf("for", StringComparison.OrdinalIgnoreCase) >= 0)
Run Code Online (Sandbox Code Playgroud)

包含方法的工作原理如下所示

public bool Contains(string value)
{
   return this.IndexOf(value, StringComparison.Ordinal) >= 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 不适用于Entity Framework 5. LINQ to Entities无法识别方法'Int32 IndexOf(System.String,System.StringComparison)'方法,并且此方法无法转换为存储表达式 (14认同)
  • 如果直接在EF对象上工作,这将不起作用.无法翻译`IndexOf()` (9认同)

Mat*_*rts 7

以前的IndexOf答案应该有效.因为您正在从数据库加载所有实体,然后对其进行内存(linq到对象)过滤,所以您根本没有在数据库上执行任何操作.

这应该也适用(从我引用的帖子)

filteredCategories = categoriesList.Where(c=> c.CategoryName.ToLower().Contains("for"));
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果你有很多类别,那么你可能想要在数据库上过滤它们,而不是从数据库中获取所有类别,然后在内存中过滤它们.

  • 这没有通过土耳其测试http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html (2认同)