よりシンプルでより正確な解決策(その後レピーの):
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)inSQLコマンドと同じです。結果の SQL は次のようになります (<query0> は の値query[0]、<query1> は の値、query[1]<queryN> はクエリ配列の最後の値):
select * from Parts where partName in ( <query0>, <query1>, ..., <queryN> );
更新: leppie の答えは、ワイルドカード文字をlikeステートメント
に追加する前にエスケープしないことに注意することも重要です。Linq はクエリを送信する前にエスケープするため、これはソリューションの問題ではありません。ソリューションのエスケープ バージョンは次のようになります。ContainsSqlMethods.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 がそれをエスケープしてくれるからです。