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

时间:2018-11-16 10:47:38

标签: c# sql linq dynamic-linq

有人在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'

2 个答案:

答案 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