C# 如何为nHibernate正确翻译LINQ string.Contains(“substring%”)?
以下代码用于为nHibernate提供一种将我的C#LINQ代码转换为正确的SQL语句的方法。我想要的是3条SQL语句,如:C# 如何为nHibernate正确翻译LINQ string.Contains(“substring%”)?,c#,linq,nhibernate,C#,Linq,Nhibernate,以下代码用于为nHibernate提供一种将我的C#LINQ代码转换为正确的SQL语句的方法。我想要的是3条SQL语句,如: "Select * From HITable Where Series LIKE %substring" 或 或 问题是,当nHibernate获取此值时,它将StartsWith、EndsWith和Contains在所有3种情况下转换为%substring%,即通配符同时放在子字符串的开头和结尾。解决这个问题的正确方法是什么 private static Ex
"Select * From HITable Where Series LIKE %substring"
或
或
问题是,当nHibernate获取此值时,它将StartsWith、EndsWith和Contains在所有3种情况下转换为%substring%,即通配符同时放在子字符串的开头和结尾。解决这个问题的正确方法是什么
private static Expression<Func<HIProduct, bool>> CheckWildCardPosition(string rangeFrom)
{
if (rangeFrom.StartsWith(SqlWildCardAnyValue.ToString()))
{
return hip => hip.ProductId.Series.StartsWith(rangeFrom);
}
else if (rangeFrom.EndsWith(SqlWildCardAnyValue.ToString()))
{
return hip => hip.ProductId.Series.EndsWith(rangeFrom);
}
else
{
return hip => hip.ProductId.Series.Contains(rangeFrom);
}
}
私有静态表达式CheckWildCardPosition(字符串范围从)
{
if(rangeFrom.StartsWith(SqlWildCardAnyValue.ToString())
{
return hip=>hip.ProductId.Series.StartsWith(rangeFrom);
}
else if(范围从.EndsWith(SqlWildCardAnyValue.ToString())
{
return hip=>hip.ProductId.Series.EndsWith(rangeFrom);
}
其他的
{
return hip=>hip.ProductId.Series.Contains(rangeFrom);
}
}
我发现使用StartsWith/EndsWith时的问题是必须删除“%”字符,否则实际上会得到2个“%”字符。这是因为nHibernate将StartsWith/EndsWith转换为“%”。因此,代码中解决方案的初稿如下所示:
private static Expression<Func<HIProduct, bool>> CheckWildCardPosition(string serie)
{
char[] wildCard = new char[] { SqlWildCardAnyValue };
if (serie.StartsWith(SqlWildCardAnyValue.ToString()))
{
if (serie.EndsWith(SqlWildCardAnyValue.ToString()))
{
return hip => hip.ProductId.Series.Contains(serie.Trim(wildCard));
}
return hip => hip.ProductId.Series.EndsWith(serie.TrimStart(wildCard));
}
else if (serie.EndsWith(SqlWildCardAnyValue.ToString()))
{
return hip => hip.ProductId.Series.StartsWith(serie.TrimEnd(wildCard));
}
else
{
string[] split = serie.Split(wildCard);
return hip => hip.ProductId.Series.StartsWith(split[0]) && hip.ProductId.Series.EndsWith(split[1]);
}
}
私有静态表达式CheckWildCardPosition(字符串序列)
{
字符[]通配符=新字符[]{SqlWildCardAnyValue};
if(serie.StartsWith(SqlWildCardAnyValue.ToString())
{
if(serie.EndsWith(SqlWildCardAnyValue.ToString())
{
return hip=>hip.ProductId.Series.Contains(serie.Trim(通配符));
}
return hip=>hip.ProductId.Series.EndsWith(serie.TrimStart(通配符));
}
else if(serie.EndsWith(SqlWildCardAnyValue.ToString())
{
return hip=>hip.ProductId.Series.StartsWith(serie.TrimEnd(通配符));
}
其他的
{
字符串[]拆分=序列拆分(通配符);
return hip=>hip.ProductId.Series.StartsWith(split[0])和&hip.ProductId.Series.EndsWith(split[1]);
}
}
请记住,这是一个初稿,我知道代码可以被重构为更有效的代码,但在第一步中,这解决了我的问题
private static Expression<Func<HIProduct, bool>> CheckWildCardPosition(string rangeFrom)
{
if (rangeFrom.StartsWith(SqlWildCardAnyValue.ToString()))
{
return hip => hip.ProductId.Series.StartsWith(rangeFrom);
}
else if (rangeFrom.EndsWith(SqlWildCardAnyValue.ToString()))
{
return hip => hip.ProductId.Series.EndsWith(rangeFrom);
}
else
{
return hip => hip.ProductId.Series.Contains(rangeFrom);
}
}
private static Expression<Func<HIProduct, bool>> CheckWildCardPosition(string serie)
{
char[] wildCard = new char[] { SqlWildCardAnyValue };
if (serie.StartsWith(SqlWildCardAnyValue.ToString()))
{
if (serie.EndsWith(SqlWildCardAnyValue.ToString()))
{
return hip => hip.ProductId.Series.Contains(serie.Trim(wildCard));
}
return hip => hip.ProductId.Series.EndsWith(serie.TrimStart(wildCard));
}
else if (serie.EndsWith(SqlWildCardAnyValue.ToString()))
{
return hip => hip.ProductId.Series.StartsWith(serie.TrimEnd(wildCard));
}
else
{
string[] split = serie.Split(wildCard);
return hip => hip.ProductId.Series.StartsWith(split[0]) && hip.ProductId.Series.EndsWith(split[1]);
}
}