【问题标题】:LINQ to Entities does not recognize the method System.String ToBase64String(Byte[])LINQ to Entities 无法识别 System.String ToBase64String(Byte[]) 方法
【发布时间】:2017-04-05 12:58:13
【问题描述】:
var pList = (from p in db.RTLS_PERSONDTLS
             where (lsdAts <= p.CREATED_TIME && 
             p.CREATED_TIME <= DateTime.Now)
             where p.OPERATION_TYPE == 1

             let pPhotoRow = (from q in db.Cloud_persons_images
                             where q.Image_name == p.PERSON_ID
                             where (lsdAts <= q.Createdtime && q.Createdtime <= DateTime.Now)
                             select q).FirstOrDefault()

                             let pExt = pPhotoRow.Img_ext
                             let photoBytes = pPhotoRow.Person_img

                             Let personPhoto =  new PersonPhotoInfo { PDATA = Convert.ToBase64String(photoBytes), PEXT = pExt }

            select new PersonListInfoDTO
             {
                MOB_NO = p.MOBILE_NO,
                ACTINACT = (int)p.ACTINACT,
                PHOTO = personPhoto
             }).AsNoTracking().ToList();

将字节数组转换为 ToBase64String 时出现异常,因为 LINQ to Entities 无法识别“System.String ToBase64String(Byte[])”方法,而这方法无法转换为存储表达式。我使用 sql Azure 作为我的后端存储。

【问题讨论】:

  • 我已经尝试了互联网上针对此异常提供的许多可能的解决方案,但我没有得到解决我的问题的解决方案。感谢您提供的链接
  • 解决方案总是一模一样的——双投影。首先在匿名类型中获取原始数据,然后是 AsEnumerable() 和可以使用任何 CLR 方法的实际投影。

标签: c# entity-framework linq azure-sql-database


【解决方案1】:

Linq 会将您的查询转换为 sql,生成的查询将包含对 Convert.ToBase64String 方法的调用,其中 sql 不知道。 您可以执行 ToList() 将对象从数据库加载到内存中,然后应用 Convert.ToBase64String 方法

var pList = (from item in (from p in db.RTLS_PERSONDTLS
         where (lsdAts <= p.CREATED_TIME && 
         p.CREATED_TIME <= DateTime.Now)
         where p.OPERATION_TYPE == 1

         let pPhotoRow = (from q in db.Cloud_persons_images
                         where q.Image_name == p.PERSON_ID
                         where (lsdAts <= q.Createdtime && q.Createdtime <= DateTime.Now)
                         select q).FirstOrDefault())
                      select new {
                           p.MOBILE_NO,
                           p.ACTINACT,
                           Img_ext= pPhotoRow.Img_ext,
                           photoBytes=pPhotoRow.Person_img
                           }).ToList()
        .Select(t=> new PersonListInfoDTO
         {
            MOB_NO = item.MOBILE_NO,
            ACTINACT = (int)item.ACTINACT,
            PHOTO = new PersonPhotoInfo { PDATA = Convert.ToBase64String(item.photoBytes), PEXT = pExt }
         }).ToList();

【讨论】:

  • 这个想法也奏效了。但我无法将其标记为答案堆栈溢出不允许我一次接受两个答案
【解决方案2】:

这个呢

var pList =from item in (from p in db.RTLS_PERSONDTLS
             where (lsdAts <= p.CREATED_TIME && 
             p.CREATED_TIME <= DateTime.Now)
             where p.OPERATION_TYPE == 1

             let pPhotoRow = (from q in db.Cloud_persons_images
                             where q.Image_name == p.PERSON_ID
                             where (lsdAts <= q.Createdtime && q.Createdtime <= DateTime.Now)
                             select q).FirstOrDefault()
                          select new {
                               p.MOBILE_NO,
                               p.ACTINACT,
                               Img_ext= pPhotoRow.Img_ext,
                               photoBytes=pPhotoRow.Person_img
                               }).ToList())                             )

            select new PersonListInfoDTO
             {
                MOB_NO = item.MOBILE_NO,
                ACTINACT = (int)item.ACTINACT,
                PHOTO = new PersonPhotoInfo { PDATA = Convert.ToBase64String(item.photoBytes), PEXT = pExt }
             }).AsNoTracking().ToList();

【讨论】:

  • 是的,这个想法对我有用,几乎没有修改,修改是 1.AsNoTracking() 在项目集合中被删除。 2. PEXT = pExt 改为 PEXT = item.Img_ext。现在它工作正常谢谢你
  • 很高兴为您提供帮助
猜你喜欢
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 2016-09-07
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
相关资源
最近更新 更多