2013-03-12 60 views
10

我想在linq中将这样的结果集查询到实体;LINQ to Entities Contains Case In-Sensitive Searching

var categoriesList = _catRepo.GetAllCategories(); 


filteredCategories = categoriesList.Where(c=> c.CategoryName.Contains("for")); 

但是,我没有得到任何结果监守的CategoryName在数据库For(Upper Case)。我也检查了sql server排序规则,它设置为_CI_AS。我不知道如何使用包含过滤大小写不敏感的字符串? 我想基本上如果有人类型喜欢;

filteredCategories = categoriesList.Where(c=> c.CategoryName.Contains("for")); 

OR

filteredCategories = categoriesList.Where(c=> c.CategoryName.Contains("For")); 

结果应该是一样的

+3

这是回答这个问题吗? http://stackoverflow.com/questions/3360772/linq-contains-case-insensitive – 2013-03-12 13:46:51

+0

它does not't为我工作 – 2013-03-12 13:48:25

+1

我认为,通常适用于你说的排序规则。你确定'categoriesList'是一个数据库查询,而不是已经在内存列表中查询(在这种情况下,你的表达式不会被转换为SQL)。另外,如果你在那个时候跟踪db查询,那么生成的SQL是什么? – 2013-03-12 13:48:49

回答

17

试试这个

filteredCategories = categoriesList.Where(c=> 
c.CategoryName.IndexOf("for", StringComparison.OrdinalIgnoreCase) >= 0) 

包含方法效果如下图所示

public bool Contains(string value) 
{ 
    return this.IndexOf(value, StringComparison.Ordinal) >= 0; 
} 
+2

+1解释indexof? – 2013-03-12 13:53:02

+0

http://msdn.microsoft.com/en-us/library/ms224425.aspx – Shymep 2013-03-12 13:57:55

+9

如果直接在EF对象上工作,这将不起作用。无法翻译IndexOf()' – Rufix 2013-09-25 13:01:19

6

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

这也应该工作(从我所引用的文章)

filteredCategories = categoriesList.Where(c=> c.CategoryName.ToLower().Contains("for")); 

就撤销,如果你有很多类别,那么你可能要对其进行过滤的数据库,而不是获取所有分贝,然后过滤它们在内存中..

+0

包含将调用IndexOf反正 – Shymep 2013-03-12 14:02:41

+0

@Shymep烨我知道,我只是提供这个完整性:) – 2013-03-12 14:05:08

+1

这不通过土耳其测试http://www.moserware.com/2008/02/does -your-code-pass-turkey-test.html – Odys 2014-03-13 01:11:50