web-dev-qa-db-ja.com

C#LINQでSQL LIKE演算子を使用する

C#でクエリを作成しています。整数フィールドと文字列フィールドの場合、ケースは非常に簡単です。日付フィールドには、次のクエリを使用しています。

list.Where("myDateColumn >= DateTime(2017,1,20)");

LINQで次のSQL LIKEクエリを実行するにはどうすればよいですか?

select * from table where myTextColumn LIKE '%abc%';
6
Behzad Qureshi

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'));
22

LIKE句にワイルドカード「%」を配置すると違いが生じ、C#にはこれをバックアップする方法があります。以下は、ワイルドカードの配置の意味です。

LIKE '%abc'

意味:「abc」で終わる単語を検索します。

C#と同等EndsWith

LIKE 'abc%'

意味:「abc」で始まる単語を検索しますが、その後のテキストは気にしません。

C#と同等StartWith

LIKE '%abc%'

意味: 'abc'を含むWordを検索します。Wordのどこに表示されるかは気にしません。

C#と同等Contains

5
monstertjie_za

myTextColumnフィールドで Contains を使用できます

var date = new DateTime(2017,1,20);
list.Where(x => x.myDateColumn >= date  && x.myTextColumn.Contains('abc'));
2
Satpal

一般的なケースで問題を解決してみましょう。次のようなものが与えられたとします

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%")));
1
Dmitry Bychenko