簡體   English   中英

如何為nHibernate正確翻譯LINQ string.Contains(“ substring%”)?

[英]How to translate LINQ string.Contains(“substring%”) correctly for 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);
        }
    }

我發現使用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]);
        }
    }

請記住,這是初稿,我知道可以將代碼重構為更有效的代碼,但是第一步可以解決我的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM