【问题标题】:LINQ to Entities does not recognize the method 'System.String LetterType(Byte)' method, and this method cannot be translated into a store expressionLINQ to Entities 无法识别方法 'System.String LetterType(Byte)' 方法,并且此方法无法转换为存储表达式
【发布时间】:2019-10-31 00:08:29
【问题描述】:

我在MVC c#中有这段代码,它的概念是好的。 “x.Letter.Kind”是我想在创建列表时翻译成文本的数字。所以我写了一个函数(LetterType),它接受一个字节并返回其关联的文本。但是当程序运行时,它给了我一个错误,上面写着:

{"LINQ to Entities 无法识别方法 'System.String LetterType(Byte)' 方法,并且该方法无法转换为存储表达式。"}

我不明白这是什么意思。有人可以帮我解决这个问题吗? 谢谢

 public JsonResult GetLetterList(DataTablesParam param)
    {
        int fld_id = 23571;
        int userId = 1454;
        int totalCount = 0;
        List<ViewLetterInformation> list = new List<ViewLetterInformation>();
        using (WebECartableEntities db = new WebECartableEntities())
        {
            int pageNo = 1;
            if (param.iDisplayStart >= param.iDisplayLength)
            {
               pageNo = param.iDisplayStart / param.iDisplayLength + 1;
            }                    
            totalCount = db.Referrings.Where(x => x.usr_Receiver__Id == userId && x.fld_Id == fld_id).Count();
            list = db.Referrings.Where(x => x.usr_Receiver__Id == userId && x.fld_Id == fld_id).OrderBy(x => x.Letter_Id).Skip((pageNo - 1) * param.iDisplayLength).Take(param.iDisplayLength).Select(x => new ViewLetterInformation                        
            {
               Letter_Id = x.Letter_Id,
               ProjectCode = x.Letter.Project.Code,
               LetterType = LetterType(x.Letter.Kind)   //This line gives error
               Ref_subject = x.Subject
             }).ToList();
             return Json(new
                {
                    aaData = list,
                    sEcho = param.sEcho,
                    iTotalDisplayRecords = totalCount,
                    iTotalRecords = list.Count()
                }, JsonRequestBehavior.AllowGet);
            }                
        }
    }


 private string LetterType(byte LetterType)
    {
        string result = "";
        switch (LetterType)
        {
            case 0:
            case 4:
            case 8:
                result = "Import";
                break;
            case 1:
            case 5:
            case 9:
                result = "Export";
                break;
            case 2:
            case 6:
            case 10:
                result = "Internal";
                break;
            default:
                result = "";
                break;
        }
        return result;
    }

如果我使用

 LetterType = x.Letter.Kind.toString()

而不是

 LetterType = LetterType(x.Letter.Kind)

它工作正常,但我需要它的等效文本数据。

谢谢

【问题讨论】:

  • 如果您在Select 之前放置AsEnumerable,这将导致您的投影发生在内存中,您不必担心将代码转换为SQL。
  • 您可以从中获取list,然后应用LetterType 过滤器。 Linq to entity 将无法将您的方法转换为 SQL 语句。
  • LetterType 是枚举吗?如果是这样,而不是使用种类。试试 LetterType = (这里放枚举类型,不是实际的枚举名称)LetterType
  • @jdweng:不是
  • 问题是 EF 正在尝试将您的 C# 代码转换为 SQL。它知道如何对大多数 C# 运算符和通用库执行此操作,但不适用于您的自定义方法。因此,通过使用AsEnumerable,您会告诉您此时停止转换为 SQL,并在获取数据后在内存中执行其余的 Linq 代码。

标签: c# entity-framework linq linq-to-entities


【解决方案1】:

尝试通过像这样调用 .ToList() 将实体带入内存:

list = db.Referrings.ToList().Where(...).Select(...).ToList();

【讨论】:

  • DBSet 上执行ToList 将拉回整个表。相反,它应该在Where 之后完成,因此您只需拉回所需的行。此外,最好使用AsEnumerable,这样您就不必创建不需要的中间列表并重复两次结果。
猜你喜欢
  • 1970-01-01
  • 2011-08-19
  • 2011-08-23
  • 2012-12-02
  • 1970-01-01
  • 2016-12-19
  • 1970-01-01
相关资源
最近更新 更多