C# 动态库(System.Linq.Dynamic)类SQL运算符

C# 动态库(System.Linq.Dynamic)类SQL运算符,c#,sql,linq,dynamic-linq,C#,Sql,Linq,Dynamic Linq,有人在这里发布了一个类似的问题 但这并不是我想要的。包含该帖子中提到的运算符,仅在SQL中执行此操作“%SOMETHING%”。但是SQL中的LIKE操作符可以做这个“某些%的事情”。动态LINQ是否有类似的运算符?如果没有,是否有解决方案?也许用正则表达式?还有单字符通配符吗?例如,“SOM$THING”返回“SOMETHING”或“SOM3THING” 编辑:我正在开发一个WPF应用程序,它应该读取XML格式的日志文件。每个元素包含34个字段。因此,我没有编写很长的WHERE,而是使用Sys

有人在这里发布了一个类似的问题

但这并不是我想要的。包含该帖子中提到的运算符,仅在SQL中执行此操作“%SOMETHING%”。但是SQL中的LIKE操作符可以做这个“某些%的事情”。动态LINQ是否有类似的运算符?如果没有,是否有解决方案?也许用正则表达式?还有单字符通配符吗?例如,“SOM$THING”返回“SOMETHING”或“SOM3THING”

编辑:我正在开发一个WPF应用程序,它应该读取XML格式的日志文件。每个元素包含34个字段。因此,我没有编写很长的WHERE,而是使用System.Reflection.PropertyInfo迭代每个字段来编写查询,然后使用System.Linq.Dynamic来执行它

Edit2:我已经编辑了代码,因此观众更容易阅读

下面是一些代码:

例1: prop.Name=“FirstName”,parameterstring=“Ke%in”,返回“Kevin”, “开尔文”。。。 例2: prop.Name=“FirstName”,parametrstString=“Ke$in”,返回“Kevin”, “科林”


其中一个要求是实现一个类似SQL的操作符,这样用户就可以使用类似这样的方法来获得他们想要的结果:FirstName类似于“SOME%THING”

由于动态Linq库中没有类似的操作符,所以我创建了自己的版本。代码并不漂亮,但确实有效。希望有人能优化它或提出更好的方法来做到这一点

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();
}
公共字符串ParseWildcardInParameterString(字符串参数,字符串属性名称)
{
字符串stringWithWildcard=参数;
if(parameter.Contains(“%”)| | parameter.Contains($”)
{
stringWithWildcard=参数;
string[]substrings=parameter.Split(新字符[]{“%”,“$”},StringSplitOptions.RemoveEmptyEntries);
字符串[]通配符=解析通配符(参数);
if(substring.Any())
{
StringBuilder sb=新的StringBuilder();
int substringscont=substring.Length;
对于(int i=0;i-1)
{
字符串第二部分=通配符[i]。等于(“%”)?
$“{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(\“{substring[i]}\”)>-1和{secondPart})和“);
}
}
}
}
stringWithWildcard=sb.Remove(sb.Length-5,5)。追加(“)或“).ToString();
}
}
返回带有通配符的字符串;
}
私有字符串[]解析通配符(字符串参数)
{
IList通配符=新列表();
foreach(parameter.ToCharArray()中的var字符)
{
if(chararcter.Equals('%')| | chararcter.Equals('$'))
{
通配符.Add(chararcter.ToString());
}
}
返回通配符.ToArray();
}

您能否尝试中的Like功能是否适合您

代码示例为:

var dynamicFunctionsLike1=context.Cars.Where(配置,“DynamicFunctions.Like(Brand,\%a%\”)


有关完整示例,请参见

是否可以将项目限制为MS SQL Server?然后,您可以使用动态LINQ来支持
SQLMethods。例如
。不幸的是,这是不可能的,因为数据是通过读取XML文件导入的。在您链接的帖子上,建议使用
Contains
StartsWits
EndsWith
的组合。这对你有用吗?您还可以使用正则表达式,如图所示。但是像
这样纯粹的
是LInq没有提供的。这就是我害怕的。因此,我使用String.IndexOf()创建了自己的LIKE运算符。如果有人可以审查代码,甚至更好,优化它,我将不胜感激。代码被贴在了答案中。听起来好像这与SQL无关。如果您只是想为LINQ实现一个
LIKE
样式的操作符,我建议将SQL
LIKE
模式转换为RE,并使用C#正则表达式处理。我遇到了一个错误“DynamicFunctions is not valid”或其他什么。您使用EF 2.x吗?不,我只使用标准的动态LINQ。这段代码实际上执行过滤器。filteredData=filteredData.Where(query,parameters.ToArray());要做到这一点,你需要裸体
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();
}