よりシンプルでより正確な解決策(その後レピーの):
public IQueryable<Part> SearchForParts(string[] query)
{
var q = db.Parts.AsQueryable();
foreach (string qs in query)
{
q = q.Where(x => x.partName.Contains(qs));
}
return q;
}
partName
これは、文字列 (または文字列に相当する SQL) である限り機能します。
注意すべき重要なことは、 とpartName.Contains(qs)
は異なりquery.Contains(partName)
ます。
でpartName.Contains(qs)
、partName
の出現を検索しますqs
。結果の SQL は同等になります (ここで <qs> は の値ですqs
)。
select * from Parts where partName like '%<qs>%';
また、StartsWith
とEndsWith
に似てContains
いますが、特定の場所で文字列を探します。
query.Contains(partName)
in
SQLコマンドと同じです。結果の SQL は次のようになります (<query0> は の値query[0]
、<query1> は の値、query[1]
<queryN> はクエリ配列の最後の値):
select * from Parts where partName in ( <query0>, <query1>, ..., <queryN> );
更新: leppie の答えは、ワイルドカード文字をlikeステートメント
に追加する前にエスケープしないことに注意することも重要です。Linq はクエリを送信する前にエスケープするため、これはソリューションの問題ではありません。ソリューションのエスケープ バージョンは次のようになります。Contains
SqlMethods.Like
public IQueryable<Part> SearchForParts(string[] query)
{
var q = db.Parts.AsQueryable();
foreach (var qs in query)
{
string escaped_bs = qs.Replace("/", "//"),
escaped_us = escaped_bs.Replace("_", "/_"),
escaped_p = escaped_us.Replace("%", "/%"),
escaped_br = escaped_p.Replace("[", "/["),
likestr = string.Format("%{0}%", escaped_br);
q = q.Where(x => SqlMethods.Like(x.partName, likestr, '/'));
}
return q;
}
' について心配する必要はありません。Linq がそれをエスケープしてくれるからです。