我在Helper方法类中创建了删除Diacritics的扩展方法,
namespace MvcCms.Models.Utilities
{
public static class HelperMethods
{
public static string RemoveDiacritics(this string stIn)
{
string stFormD = stIn.Normalize(NormalizationForm.FormD);
StringBuilder sb = new StringBuilder();
for (int ich = 0; ich < stFormD.Length; ich++)
{
UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
if (uc != UnicodeCategory.NonSpacingMark)
{
sb.Append(stFormD[ich]);
}
}
return (sb.ToString().Normalize(NormalizationForm.FormC));
}
}
}
我创建了一个控制器,让Json结果动作搜索没有变音符号的术语,
using MvcCms.Models.Utilities;
namespace MvcCms.Controllers
{
public class AjaxController : ControllerHelper
{
public JsonResult AutoCompleteCategories(string term, int id)
{
string termWithoutDiacritics = term.RemoveDiacritics();
var searchResult = db.C_Categories.Where(x => x.CatVocId == id && (x.Title.RemoveDiacritics().ToUpper().Contains(term.ToUpper()) || x.Title.ToUpper().Contains(termWithoutDiacritics.ToUpper())));
var jsonResult = searchResult.Select(results => new { id = results.CatId, name = results.Title });
return Json(jsonResult, JsonRequestBehavior.AllowGet);
}
}
}
当我运行代码时,它给了我错误:LINQ to Entities无法识别方法'System.String RemoveDiacritics(System .String)'方法,并且此方法无法转换为商店表达式
答案 0 :(得分:2)
这是因为 LINQ to Entities无法识别方法&#39; System.String RemoveDiacritics(System .String)&#39;方法,此方法无法转换为商店表达式。 LINQ to Entities尝试将您的查询转换为数据提供程序支持的语言(通常是SQL)。由于您的查询调用RemoveDiacritics
并且无法像这样翻译,因此您会收到错误。
您可以将数据提取到内存中,然后通过LINQ to Objects将方法应用到内存中。这种方法可能导致严重的性能问题。明智地使用它。
var items = db.C_Categories.Where(x => x.CatVocId == id).ToList();
var searchResult = items.Where(x => x.Title.RemoveDiacritics().ToUpper().Contains(term.ToUpper()) ||
x.Title.ToUpper().Contains(termWithoutDiacritics.ToUpper()));