在我的查詢中
public IEnumerable<RepInfo> GetRepsByCountry(string country)
{
var reps = RepInfoProvider.GetReps()
.WhereLike("CountriesCovered", $"%{country}%")
.ToList();
return reps;
}
資料庫中涵蓋的國家是分號分隔的串列(例如:德國;挪威;西班牙;羅馬尼亞)
當傳入的國家是阿曼時,回傳的串列包含與羅馬尼亞相關的資料(因為阿曼在羅馬尼亞),有沒有辦法使用 wherelike 但如果不是完全匹配則過濾掉?
uj5u.com熱心網友回復:
之后進行記憶體搜索。只推薦幾行
var reps = RepInfoProvider.GetReps()
.WhereLike("CountriesCovered", $"%{country}%")
.ToList()
.Where(x => Regex.IsMatch(x.CountriesCovered, $"\\b{country}\\b"))
.ToList()
uj5u.com熱心網友回復:
更好的主意:規范化您的資料庫設計,以便您可以直接查詢該國家/地區串列,而無需在 SQL 中進行字串處理,這太可怕了。
反正,
如果其中的所有子字串CountriesCovered都以分號分隔,那么如果您想要完全匹配,那么您需要將分號放在通配符內的搜索字串中。%
我假設在分號之后,國家名稱之前有一個空格。
我還假設CountriesCovered字串在整個字串的開頭和結尾沒有分號 - 這意味著您需要使用OR...
在 SQL 中是這樣的(為了清楚起見,使用文字,而不是引數):
WHERE
( CountriesCovered LIKE '%; Oman;%' ) -- Word is inside string.
OR
( CountriesCovered LIKE 'Oman;%' ) -- Word is at start of string.
OR
( CountriesCovered LIKE '%; Oman' ) -- Word is at end of string.
在 Linq-to-Entities 中,這將是這樣的:
List<Rep> reps = await dbContext.Reps
.Where( r =>
r.CountriesCovered.Contains( "; Oman;" )
||
r.CountriesCovered.StartsWith( "Oman;" )
||
r.CountriesCovered.EndsWith( "; Oman" )
)
.ToListAsync()
.ConfigureAwait(false);
EF 會將String.Contains、StartsWith和EndsWithfunction 運算式轉換為 T-SQLLIKE運算子,并%自動添加通配符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/494205.html
