gpt4 book ai didi

c# - 动态库 (System.Linq.Dynamic) SQL LIKE 运算符

转载 作者:太空宇宙 更新时间:2023-11-03 12:09:08 24 4
gpt4 key购买 nike

有人在这里发布了类似的问题 How Dynamic library (System.Linq.Dynamic) support LIKE Operator?

但这并不是我想要的。该帖子中提到的 Contains 运算符仅在 SQL "%SOMETHING%" 中执行此操作。但是 SQL 中的 LIKE 运算符可以做到这一点 "SOME%THING"。 Dynamic 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'

最佳答案

由于 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();
}

关于c# - 动态库 (System.Linq.Dynamic) SQL LIKE 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53336298/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com