2013-03-12 1 views
10

linqでエンティティにこのような結果セットを照会しようとしています。 CategoryNameは、データベース内のFor(Upper Case)あるbecuaseLINQ Toエンティティに大文字小文字の区別が含まれています

var categoriesList = _catRepo.GetAllCategories(); 


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

しかし、私はどんな結果を得ることはありません。 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 –

+0

それは私のために働いていません –

+1

私はあなたが言う照合で正常に動作すると思います。 'categoriesList'がDBクエリであり、既にメモリリスト内で照会されていないことを確かめます(その場合、式はsqlに変換されません)。また、その時点でdbクエリをトレースすると、どのSQLが生成されていますか? –

答えて

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の説明のために? –

+0

http://msdn.microsoft.com/en-us/library/ms224425.aspx – Shymep

+9

EFオブジェクトで直接作業している場合、これは機能しません。 'IndexOf()'を翻訳できません – Rufix

6

前のIndexOf答えがうまくいきます。あなたはデータベースからすべてのエンティティを読み込んでいて、その上でインメモリ(linq to objects)フィルタを実行しているので、データベース上で何もしません。

これはまた、あなたがカテゴリの多くを持っている場合は、データベース上でそれらをフィルタリングするのではなく、からすべてフェッチする場合があります、脇だけ

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

(私は参照ポストから)動作するはずですデータベースをフィルタリングし、それらをメモリにフィルターします。

+0

とにかくIndexOfを呼び出します。 – Shymep

+0

@Shymepはい、私はちょうど完成のためにこれを提供していました:) –

+1

これはトルコのテストに合格しませんhttp://www.moserware.com/2008/02/does -your-code-pass-turkey-test.html – Odys

関連する問題