C# 如何为nHibernate正确翻译LINQ string.Contains(“substring%”)?

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

以下代码用于为nHibernate提供一种将我的C#LINQ代码转换为正确的SQL语句的方法。我想要的是3条SQL语句,如:

"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]);
        }
    }