[英]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.