2015-08-20 3 views
0

Я работаю над службой REST, которая возвращает данные в приложение Windows Phone, и время ответа на запрос является соображением. Код в настоящее время выглядит следующим образом:Linq Несколько ссылок на отношение внешних ключей в конкатенации строк

List<RestModels.Response.RealWorkOrder> RWOList = _context.MOB_WORKORDERS_SUMMARY 
       .Where(mws => _context.TBL_USER_GROUP_MEMBERS.Any(u => u.user_Id == UserID && u.user_Group_Id == mws.user_group_id))// && !disallowedStatuses.Contains(mws.workorder_status_id ?? -1)) 
       .Select(mob => _context.FMIS_WORKORDER.FirstOrDefault(wo => wo.workorder_id == mob.workorder_id)) 
       .Select(wo => 
      new RestModels.Response.RealWorkOrder() 
      { 
       AssetLocation = wo.FMIS_ASSET_LOCATION.asset_location_description, 
       IAssets = wo.FMIS_WORKORDER_ASSETS.Select(woa => new RestModels.Subclasses.Asset() 
       { 
        AssetId = woa.FMIS_ASSET.asset_id, 
        AssetName = woa.FMIS_ASSET.asset_title + " - " + woa.FMIS_ASSET.asset_description, 
        SerialNumber = woa.FMIS_ASSET.asset_UF_1 
       }), 
       ... 

       CategoryDescription = _context.VIEW_WORK_CATEGORIES.Where(cat => cat.work_category_id == wo.FMIS_WORKREQUEST1.FirstOrDefault().workrequest_category).FirstOrDefault().work_category_title + " - " + 
        _context.VIEW_WORK_CATEGORIES.Where(cat => cat.work_category_id == wo.FMIS_WORKREQUEST1.FirstOrDefault().workrequest_category).FirstOrDefault().work_category_description + " [" + 
        _context.VIEW_WORK_CATEGORIES.Where(cat => cat.work_category_id == wo.FMIS_WORKREQUEST1.FirstOrDefault().workrequest_category).FirstOrDefault().work_category_priority_name + "]", 

Моего вопрос относится к области CategoryDescription - конкатенация, оказывается довольно дорогие. Есть ли способ сделать отдельную ссылку на запись просмотра и объединить поля «на лету»?

ответ

1

Можете ли вы попробовать это, я избегал нескольких вызовов базы данных. Я не скомпилировал его, поэтому могут возникнуть некоторые проблемы с синтаксисом.

List<RestModels.Response.RealWorkOrder> RWOList = _context.MOB_WORKORDERS_SUMMARY 
      .Where(mws => _context.TBL_USER_GROUP_MEMBERS.Any(u => u.user_Id == UserID && u.user_Group_Id == mws.user_group_id))// && !disallowedStatuses.Contains(mws.workorder_status_id ?? -1)) 
      .Select(mob => _context.FMIS_WORKORDER.FirstOrDefault(wo => wo.workorder_id == mob.workorder_id)) 
      //// added below line to get the category item in one go 
      .Select(tempLet => new {workOrder = tempLet, CategoryItem = _context.VIEW_WORK_CATEGORIES.Where(cat => cat.work_category_id == tempLet.FMIS_WORKREQUEST1.FirstOrDefault().workrequest_category).FirstOrDefault()}) 
      .Select(wo => 
     new RestModels.Response.RealWorkOrder() 
     { 
      AssetLocation = wo.workOrder.FMIS_ASSET_LOCATION.asset_location_description, 
      IAssets = wo.workOrder.FMIS_WORKORDER_ASSETS.Select(woa => new RestModels.Subclasses.Asset() 
      { 
       AssetId = woa.FMIS_ASSET.asset_id, 
       AssetName = woa.FMIS_ASSET.asset_title + " - " + woa.FMIS_ASSET.asset_description, 
       SerialNumber = woa.FMIS_ASSET.asset_UF_1 
      }), 
      ... 

      CategoryDescription = wo.CategoryItem.work_category_title + " - " + 
       wo.CategoryItem.work_category_description + " [" + 
       wo.CategoryItem.work_category_priority_name + "]", 
+0

Благодарим вас за отзыв. Дополнительный оператор select вызывает ошибку компиляции, потому что переменная wo не существует в текущем контексте. – Spodgy

+0

Можете ли вы попробовать сейчас, я обновил код. – HashCoder

+0

Большое спасибо. Это отлично работает. – Spodgy