有人在How Dynamic library (System.Linq.Dynamic) support LIKE Operator?
上发布了类似的问题但这不是我想要的。该帖子中提到的包含运算符只能在SQL “%SOMETHING%” 中执行。但是SQL中的 LIKE 运算符可以执行“ SOME%THING” 。动态LINQ是否有类似的运算符?如果没有,是否有解决方案?也许与正则表达式?还有单个字符通配符吗?例如。 “ SOM $ THING”返回“ SOMETHING”或“ SOM3THING”
编辑:我正在开发WPF应用程序,该应用程序应读取XML格式的日志文件。每个元素包含34个字段。因此,我没有使用很长的WHERE,而是使用System.Reflection.PropertyInfo迭代每个字段来编写查询,然后使用System.Linq.Dynamic执行查询。
Edit2:我已经编辑了代码,因此观众更容易阅读。
以下是一些代码:
示例1: prop.Name =“ FirstName”,paramterString =“ Ke%in”,返回“ Kevin”, “开尔文” ... 范例2: prop.Name =“ FirstName”,paramterString =“ Ke $ in”,返回“ Kevin”, “凯琳” ...
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);
其中一项要求是实现SQL LIKE运算符,以便用户可以使用类似的方法来获得所需的结果:FirstName LIKE'SOME%THING'
答案 0 :(得分:0)
由于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();
}
答案 1 :(得分:0)
您能否尝试System.Linq.Dynamic.Core中的 Like 功能对您有用吗?
代码示例为:
var dynamicFunctionsLike1 = context.Cars.Where(config, "DynamicFunctions.Like(Brand, \"%a%\")");
有关完整示例,请参见ConsoleAppEF2.1.1/Program.cs