实体框架无法识别扩展方法

时间:2016-05-05 09:28:29

标签: c# asp.net-mvc entity-framework linq

我在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)'方法,并且此方法无法转换为商店表达式

1 个答案:

答案 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()));