誰かが同様の質問をここに投稿しました。 動的ライブラリ(System.Linq.Dynamic)はLIKE演算子をどのようにサポートしますか?
しかし、それは私が望むものではありません。その投稿で言及されているContains演算子は、SQL "%SOMETHING%"でのみこれを実行します。しかし、SQLのLIKE演算子はこれを"SOME%THING"で実行できます。動的LINQに同様の演算子はありますか?そうでない場合、これに対する解決策はありますか?たぶん正規表現で?また、1文字のワイルドカードはありますか?たとえば、「SOM $ THING」は「SOMETHING」または「SOM3THING」を返します
編集:XMLファイルのログファイルを読み取るWPFアプリケーションを開発しています。各要素には34個のフィールドが含まれています。したがって、非常に長いWHEREを記述する代わりに、System.Reflection.PropertyInfoを使用して各フィールドを反復処理し、クエリを記述してから、System.Linq.Dynamicを使用してクエリを実行しました。
Edit2:視聴者が読みやすいようにコードを編集しました。
ここにいくつかのコードがあります:
例1:prop.Name = "FirstName"、paramterString = "Ke%in"、は "Kevin"、 "Kelvin" ...を返します...例2:prop.Name = "FirstName"、paramterString = "Ke $ in"は返します「ケビン」「ケリン」...
var query = "";
StringBuilder sb = new StringBuilder();
foreach (var prop in stringProps)
{
sb.Append($"({prop.Name} != null And {prop.Name}.Contains({parameterString})");
}
query = sb.ToString().Substring(0, sb.Length - 4);
filteredData = filteredData.Where(query);
要件の1つはSQL LIKE演算子を実装することです。そのため、ユーザーは次のようなものを使用して、必要な結果を得ることができます。FirstName LIKE 'SOME%THING'
Dynamic LinqライブラリにはLIKE演算子がないため、私はそれを自分のバージョンで作成しました。コードはきれいではありませんが、動作します。うまくいけば、誰かがそれを最適化したり、これを行うためのより良い方法を提案したりできます。
public string ParseWildcardInParameterString(string parameter, string propertyName)
{
string stringWithWildcard = parameter;
if (parameter.Contains("%") || parameter.Contains("$"))
{
stringWithWildcard = parameter;
string[] substrings = parameter.Split(new Char[] { '%', '$' }, StringSplitOptions.RemoveEmptyEntries);
string[] wildcards = ParseWildcards(parameter);
if (substrings.Any())
{
StringBuilder sb = new StringBuilder();
int substringsCount = substrings.Length;
for (int i = 0; i < substringsCount; i++)
{
if (!substrings[i].EndsWith("\\"))
{
int index = parameter.IndexOf(substrings[i]);
if (i < substringsCount - 1)
{
index = parameter.IndexOf(substrings[i + 1], index + 1);
if (index > -1)
{
string secondPart = wildcards[i].Equals("%") ?
$"{propertyName}.IndexOf(\"{substrings[i + 1]}\", {propertyName}.IndexOf(\"{substrings[i]}\") + \"{substrings[i]}\".Length) > -1" :
$"{propertyName}.IndexOf(\"{substrings[i + 1]}\", {propertyName}.IndexOf(\"{substrings[i]}\") + \"{substrings[i]}\".Length + 1) == {propertyName}.IndexOf(\"{substrings[i]}\") + \"{substrings[i]}\".Length + 1";
sb.Append($"({propertyName}.IndexOf(\"{substrings[i]}\") > -1 And {secondPart}) And ");
}
}
}
}
stringWithWildcard = sb.Remove(sb.Length - 5, 5).Append(") Or ").ToString();
}
}
return stringWithWildcard;
}
private string[] ParseWildcards(string parameter)
{
IList<string> wildcards = new List<string>();
foreach (var chararcter in parameter.ToCharArray())
{
if (chararcter.Equals('%') || chararcter.Equals('$'))
{
wildcards.Add(chararcter.ToString());
}
}
return wildcards.ToArray();
}