このコードは大文字と小文字を区別しますが、大文字と小文字を区別しないようにするにはどうすればよいですか?
public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
return this.ObjectContext.FACILITY_ITEM.Where(fi => fi.DESCRIPTION.Contains(description));
}
このコードは大文字と小文字を区別しますが、大文字と小文字を区別しないようにするにはどうすればよいですか?
public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
return this.ObjectContext.FACILITY_ITEM.Where(fi => fi.DESCRIPTION.Contains(description));
}
回答:
ここで文字列を処理していると仮定して、を使用した別の「エレガントな」ソリューションを次に示しIndexOf()
ます。
public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
return this.ObjectContext.FACILITY_ITEM
.Where(fi => fi.DESCRIPTION
.IndexOf(description, StringComparison.OrdinalIgnoreCase) != -1);
}
fi => fi.DESCRIPTION.ToLower().Contains(description.ToLower())
IEqualityComparer<string>
ものは、比較がどのように機能するかを処理するために属性を使用する必要があります。ToLowerとToUpperを使用して等しいかどうかを確認することはお勧めできません。試してみてください:.Contains(description, StringComparer.CurrentCultureIgnoreCase)
たとえば
Error 1 'string' does not contain a definition for 'Contains' and the best extension method overload 'System.Linq.ParallelEnumerable.Contains<TSource>(System.Linq.ParallelQuery<TSource>, TSource, System.Collections.Generic.IEqualityComparer<TSource>)' has some invalid arguments
Contains
with StringComparer
はパラメータとして文字列を受信しないため、ビルドエラーになります。IndexOf
でQueryable
、おそらくSQLに変換することができません。個人的には、LINQ to Databaseについて話すとき、この答えは完全に有効であることがわかりました。
LINQクエリがデータベースコンテキストで実行される場合、への呼び出しContains()
はLIKE
演算子にマップされます。
.Where(a => a.Field.Contains("hello"))
になりField LIKE '%hello%'
ます。LIKE
オペレータは、デフォルトで、ケース鈍感であるが、それはによって変更することができる列の照合順序を変更します。
LINQクエリが.NETコンテキストで実行される場合、IndexOf()を使用できますが、そのメソッドはLINQ to SQLではサポートされていません。
LINQ to SQL は、CultureInfoをパラメーターとして使用するメソッドをサポートしていません。これは、おそらくSQLサーバーが.NETと同じようにカルチャを処理することを保証できないためです。それはので、これは、完全に真実ではないんサポートをStartsWith(string, StringComparison)
。
ただし、LIKE
LINQ to SQLおよび.NETでの大文字と小文字を区別しない比較で評価されるメソッドをサポートしていないため、一貫した方法で大文字と小文字を区別しないContains()を実行することはできません。
insensitive
検索を行う必要があり、別のコンテキストではそれを行う必要がありますcase sensitive
。パフォーマンスノックを取り、「toLower()」を使用する必要がありますか?
ここで受け入れられた回答は、null文字列がある場合にToLower()が例外をスローするという事実について言及していません。より安全な方法は次のようにすることです:
fi => (fi.DESCRIPTION ?? string.Empty).ToLower().Contains((description ?? string.Empty).ToLower())
LINQ to ObjectsのC#6.0(式のボディ関数とnullの伝達を可能にする)を使用すると、次のように1行で実行できます(nullもチェックします)。
public static bool ContainsInsensitive(this string str, string value) => str?.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0;
この場合、IndexOfが最適です。
return this
.ObjectContext
.FACILITY_ITEM
.Where(fi => fi.DESCRIPTION.IndexOf(description, StringComparison.OrdinalIgnoreCase)>=0);
stringを使用できます。
lst.Where(x => string.Compare(x,"valueToCompare",StringComparison.InvariantCultureIgnoreCase)==0);
含むだけを確認したい場合は、「Any」を使用します
lst.Any(x => string.Compare(x,"valueToCompare",StringComparison.InvariantCultureIgnoreCase)==0)
public static bool Contains(this string input, string findMe, StringComparison comparisonType)
{
return String.IsNullOrWhiteSpace(input) ? false : input.IndexOf(findMe, comparisonType) > -1;
}
StringComparison.InvariantCultureIgnoreCaseは私のために仕事をします:
.Where(fi => fi.DESCRIPTION.Contains(description, StringComparison.InvariantCultureIgnoreCase));
String.Equalsメソッドを使用
public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
return this.ObjectContext.FACILITY_ITEM
.Where(fi => fi.DESCRIPTION
.Equals(description, StringComparison.OrdinalIgnoreCase));
}