C#でクエリを作成しています。整数フィールドと文字列フィールドの場合、ケースは非常に簡単です。日付フィールドには、次のクエリを使用しています。
list.Where("myDateColumn >= DateTime(2017,1,20)");
LINQで次のSQL LIKEクエリを実行するにはどうすればよいですか?
select * from table where myTextColumn LIKE '%abc%';
Like in Linqには多くの可能性があります。
LIKE '%abc%'の場合;
list.Where(x => x.myTextColumn.Contains('abc'));
LIKE 'abc%'の場合;
list.Where(x => x.myTextColumn.StartWith('abc'));
LIKE '%abc'の場合;
list.Where(x => x.myTextColumn.EndsWith('abc'));
更新:日付比較も追加する必要がある場合は、次のようにすることができます。
DateTime date2Compare = new DateTime(2017, 1, 20);
list.Where(x => myDateColumn >= date2Compare && x.myTextColumn.Contains('abc'));
LIKE句にワイルドカード「%」を配置すると違いが生じ、C#にはこれをバックアップする方法があります。以下は、ワイルドカードの配置の意味です。
LIKE '%abc'
意味:「abc」で終わる単語を検索します。
C#と同等:EndsWith
LIKE 'abc%'
意味:「abc」で始まる単語を検索しますが、その後のテキストは気にしません。
C#と同等:StartWith
LIKE '%abc%'
意味: 'abc'を含むWordを検索します。Wordのどこに表示されるかは気にしません。
C#と同等:Contains
myTextColumn
フィールドで Contains を使用できます
var date = new DateTime(2017,1,20);
list.Where(x => x.myDateColumn >= date && x.myTextColumn.Contains('abc'));
一般的なケースで問題を解決してみましょう。次のようなものが与えられたとします
select ...
where ... MyField like '%abc%'
like expressionを対応するregular oneに変換してみることができます:
Like | Description |Regular
-------------------------------------------------
_ | any character (one and only one) | .
% | any characters (zero or more) | .*
実装
// If you want to implement both "*" and "?"
private static String LikeToRegular(String value) {
return "^" + Regex.Escape(value).Replace("_", ".").Replace("%", ".*") + "$";
}
使用法:
var result list
.Where(x => Regex.IsMatch(x.myTextColumn, LikeToRegular("%abc%")));
一致する前にデータをstring
に変換することができます:
var result list
.Where(x => Regex.IsMatch(x.myDate.ToString(), LikeToRegular("%abc%")));