2017-03-14 3 views
0

私はucommerce製品からキー(製品)を検索する必要があります。ここでLINQループの文字列からアクセントを削除する - Ucommerce製品

はコードです -

string whatToSearch = "L'oreal"; 

var normalizedText = whatToSearch.Normalize(NormalizationForm.FormD); 

whatToSearch = nonSpacingMarkRegex.Replace(normalizedText, string.Empty); 

whatToSearch = Regex.Replace(whatToSearch, @"[^0-9a-zA-Z ]+", ""); 

var products = new List<UCommerce.EntitiesV2.Product>(); 

if (!string.IsNullOrWhiteSpace(whatToSearch)) 
{ 
    products = UCommerce.EntitiesV2.Product.Find(p => 
      p.VariantSku == null && p.DisplayOnSite && 
      (
       p.Sku.Contains(whatToSearch) 
       || p.Name.RemoveDiacritics().Contains(whatToSearch) 
       || p.ProductDescriptions.Any(
        d => d.DisplayName.Contains(whatToSearch) 
         || d.ShortDescription.Contains(whatToSearch) 
         || d.LongDescription.Contains(whatToSearch) 
       ) 
      ) 
    ); 
} 

var productIds = products.Select(x => x.Id).ToList(); 

そして、これは私がループ内で使用しています拡張メソッドです。

public static string RemoveDiacritics(this string s) 
{ 
    var normalizedString = s.Normalize(NormalizationForm.FormD); 
    var stringBuilder = new StringBuilder(); 

    foreach (var c in normalizedString) 
    { 
     if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark) 
      stringBuilder.Append(c); 
    } 

    return stringBuilder.ToString(); 
} 

誰でも助けることができる私は、この例外にSystem.String RemoveDiacritics(System.String)

を取得しています。

おかげ

+0

関数の名前以外に何か他のものがあるに違いありません! – TheVillageIdiot

+0

'Regex.Replace(whatToSearch、@" [^ 0-9a-zA-Z] + "、" ");'は、ASCII桁/文字とスペース以外のすべての文字を削除しています。私はそれが期待されるかどうかわからない。しかし、結合マークだけを削除する必要がある場合は、 'Regex.Replace(whatToSearch、@" \ p {M} + "、" ");' –

答えて

1

ないあなたの質問から明らかではなく、最も可能性の高い原因は、この行です:

|| p.Name.RemoveDiacritics().Contains(whatToSearch) 

私はこのコードは、クエリおよび翻訳に基づいた製品をフェッチするために、データベースに接触していると思うが見つけることができませんSQL analogueをRemoveDiacritics()関数に変換します。

EDIT: - それが動作するかどう確かにこれはたくさん遅くなりますが、とにかく試すことができます:

if (!string.IsNullOrWhiteSpace(whatToSearch)) 
{ 
    //I've added call to ALL to fetch all products and then filter on 
    //code side. 
    products = UCommerce.EntitiesV2.Product.All().Where(p => 
      p.VariantSku == null && p.DisplayOnSite && 
      (
       p.Sku.Contains(whatToSearch) 
       || p.Name.RemoveDiacritics().Contains(whatToSearch) 
       || p.ProductDescriptions.Any(
        d => d.DisplayName.Contains(whatToSearch) 
         || d.ShortDescription.Contains(whatToSearch) 
         || d.LongDescription.Contains(whatToSearch) 
       ) 
      ) 
    ); 
} 
+0

を使用してください。 whatToSearchの値をp.Nameに一致させる必要があります。だから私は両方の弦からアクセントを取り除いています。上のコードで見ることができるなら、私はすでにtoSearchからそれらを削除しました。しかし、私がループ内で同じことをしているとき、それは例外を与えています。 – Harsheet

+0

これを行う他の方法はありますか?ループ内でこれを行う場合は、 – Harsheet

+0

です。 Regex.Replace(nonSpacingMarkRegex.Replace(p.Name.Normalize(NormalizationForm.FormD)、string.Empty)例外が発生しました。 )、@ "[^ 0-9a-zA-Z] +"、 "").Contains(whatToSearch) – Harsheet

関連する問題