如何将webApi2的linq查询转换为异步代码

时间:2017-07-25 03:56:51

标签: c# linq asynchronous asp.net-web-api

如何使用async和await关键字将下面的代码段运行到另一个线程中。

var pList = (from item in (from p in db.RTLS_PERSONDTLS
                                                   where p.OPERATION_TYPE == 1
                                                   where (lsdAtc <= p.CREATED_TIME && p.CREATED_TIME <= todayEndDate)

                                                   let pPhotoRow = (from q in db.Cloud_persons_images
                                                                    where q.img_name == p.PERSON_ID
                                                                    where (lsdAtc <= q.Createdtime && q.Createdtime <= todayEndDate)
                                                                    select q).FirstOrDefault()
                                                   select new
                                                   {
                                                       p,
                                                       Img_ext = (pPhotoRow.Img_ext ?? string.Empty),
                                                       photoBytes = pPhotoRow.Person_img ?? emptyByteArray
                                                   }).ToList()

                                     select new PersonListInfoDTO
                                     {
                                         P_ID = item.p.PERSON_ID,
                                         T_ID = (int)item.p.TAG_ID.Value,
                                         PNAME = item.p.PERSONNAME,
                                         DEPT = (int)item.p.DEPARTMENT_id,
                                         DESG = (int)item.p.DESIGNATION_id,
                                         MOB_NO = item.p.MOBILE_NO,
                                         ACTINACT = (int)item.p.ACTINACT,
                                         PHOTO = new PersonPhotoInfo { PDATA = Convert.ToBase64String(item.photoBytes), PEXT = item.Img_ext },
                                         P_ZONES = (from zone in db.RTLS_TAG_ZONE_CONFIG
                                                    where (lsdAtc <= zone.created_time && zone.created_time <= todayEndDate)
                                                    where zone.tagid == item.p.TAG_ID
                                                    select (int)zone.zone_id).ToList()
                                     }).ToList();

我试过下面的代码片段

 var pList = await(from item in (from p in db.RTLS_PERSONDTLS
                                                   where p.OPERATION_TYPE == 1
                                                   where (lsdAtc <= p.CREATED_TIME && p.CREATED_TIME <= todayEndDate)

                                                   let pPhotoRow = (from q in db.Cloud_persons_images
                                                                    where q.img_name == p.PERSON_ID
                                                                    where (lsdAtc <= q.Createdtime && q.Createdtime <= todayEndDate)
                                                                    select q).FirstOrDefaultAsync()
                                                   select new
                                                   {
                                                       p,
                                                       Img_ext = (pPhotoRow.Img_ext ?? string.Empty),
                                                       photoBytes = pPhotoRow.Person_img ?? emptyByteArray
                                                   }).ToListAsync()

                                     select new PersonListInfoDTO
                                     {
                                         P_ID = item.p.PERSON_ID,
                                         T_ID = (int)item.p.TAG_ID.Value,
                                         PNAME = item.p.PERSONNAME,
                                         DEPT = (int)item.p.DEPARTMENT_id,
                                         DESG = (int)item.p.DESIGNATION_id,
                                         MOB_NO = item.p.MOBILE_NO,
                                         ACTINACT = (int)item.p.ACTINACT,
                                         PHOTO = new PersonPhotoInfo { PDATA = Convert.ToBase64String(item.photoBytes), PEXT = item.Img_ext },
                                         P_ZONES = (from zone in db.RTLS_TAG_ZONE_CONFIG
                                                    where (lsdAtc <= zone.created_time && zone.created_time <= todayEndDate)
                                                    where zone.tagid == item.p.TAG_ID
                                                    select (int)zone.zone_id).ToListAsync()
                                     }).ToListAsync();

但我的问题是我的linq子查询部分依赖于以前的结果,如果先前的查询需要一些时间来执行,那么这个查询可能是不明确的。我如何克服这个问题。

2 个答案:

答案 0 :(得分:1)

我认为你可以使用C#中的任务来帮助解决你的问题。在这里,我找到了一个链接和文章,其中显示了7种创建任务的方法。

5 Ways to start a task

答案 1 :(得分:0)

您似乎有一个巨大的linq查询表达式。将它分成几个查询并等待/异步那些单独的查询会更有意义。它也有助于提高可读性。