2

私のソリューションには DB oracle があります。このクエリでいくつかの結果を取得したいと考えています。クエリの例:

select * from doctor where doctor.name like '%IVANOV_A%';

しかし、LINQでそれを行うと、結果が得られません。

from p in repository.Doctor.Where(x => x.Name.ToLower().Contains(name))
select p;

「名前」は文字列パラメータの変数です。

Web レイアウト リクエストの次の文字列: "Ivanov a" または "A Ivanov"

しかし、ユーザーがクエリ用にパターンを選択することをお勧めします。

名前が「名」と「姓」で構成されているが、ユーザーが医師のフルネームを知らない場合、「名前で患者」を取得するにはどうすればよいですか?

PS:次のSQLを使用することを余儀なくされました:

select * 
from doctor
where doctor.name like '%Ivano%' and doctor.name like '%Serg%';
4

3 に答える 3

2

あなたはただすることができます

repository.Doctor.Where(x => x.Name.Contains(name))

linq-to-sql と linq-to-entities の両方で、これは に変換されLIKE %...%ます。ToLower比較は完全にデータベース側で行われるため、データベースの照合が使用されるため、おそらく必要さえありません。試してみる必要がありますが、多くの場合、データベースはデフォルトで大文字と小文字を区別しません。ただしToLower、必要に応じて を使用できます。これは SQL に変換されます。

名前の並びの問題について。どのような検索文字列を取得しても、末尾と先頭のスペースをいじって一致を見つけることができます。検索文字列が「A B」だとしましょう。一致は ((like "%A %" and like "% B%") or (like "% A%") and like "%B %") である必要があります。(スペース文字を見てください!)。これは、スペース文字で文字列を分割することで解決できます。

于 2012-11-23T12:10:22.707 に答える
0

これを試してください、うまくいくかもしれません(テストしていません):

from p in repository.Doctor.Where(x => x.Name.Contains(name, StringComparer.OrdinalIgnoreCase))
select p;
于 2012-11-23T11:20:37.860 に答える