C# 动态库(System.Linq.Dynamic)类SQL运算符
有人在这里发布了一个类似的问题 但这并不是我想要的。包含该帖子中提到的运算符,仅在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”, “科林”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的操作符,这样用户就可以使用类似这样的方法来获得他们想要的结果: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
样式的操作符,我建议将SQLLIKE
模式转换为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();
}