如何为nHibernate正确翻译LINQ string.Contains(" substring%")?

时间:2015-12-04 08:17:47

标签: c# linq nhibernate

以下代码用于为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);
        }
    }

1 个答案:

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

请记住,这是初稿,我知道代码可以重构为更有效的代码,但在第一步中,这解决了我的问题。