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 в качестве внутреннего хранилища.

1
Krishnarjun Banoth 5 Апр 2017 в 15:58

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();
0
jitender 5 Апр 2017 в 13:22

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();
1
Liviu Boboia 5 Апр 2017 в 13:43