以下代码用于为nHibernate提供一种将我的C#LINQ代码转换为正确的SQL语句的方法。我想要的是有3个SQL语句,如:
"Select * From HITable Where Series LIKE %substring"
或
"Select * From HITable Where Series LIKE substring%"
或
"Select * From HITable Where Series LIKE sub%ng"
问题在于,当nHibernate获得此功能时,它会将所有3种情况中的StartsWith,EndsWith和Contains转换为%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);
}
}
答案 0 :(得分:0)
我发现使用StartsWith / EndsWith时的问题是你必须删除&#39;%&#39; -character,否则你实际上会得到2&#39;%&#39; -characters。这是因为nHibernate将StartsWith / EndsWith转换为&#39;%&#39;。因此,代码中解决方案的初稿如下所示:
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]);
}
}
请记住,这是初稿,我知道代码可以重构为更有效的代码,但在第一步中,这解决了我的问题。