【问题标题】:entity framework does not recognize extension method [duplicate]实体框架不识别扩展方法[重复]
【发布时间】:2016-05-05 09:28:29
【问题描述】:

我在 Helper 方法类中创建了删除变音符号的扩展方法,

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)' 方法,并且该方法不能翻译成store表达式

【问题讨论】:

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


【解决方案1】:

这是因为 LINQ to Entities 无法识别方法 'System.String RemoveDiacritics(System .String)' 方法,并且该方法无法转换为存储表达式。 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()));

【讨论】:

  • 你能帮我举一个关于获取数据和应用方法的例子吗?
  • 但是这种方式处理大数据需要很多时间,我使用 jquery 自动完成进行搜索,它需要一种简单的方法来花费最少的时间
  • 你不能一边吃蛋糕一边吃。
  • 感谢您帮助我们用外行语言理解它@doctor。
猜你喜欢
  • 2017-03-12
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
相关资源
最近更新 更多