Преобразование запроса sql с несколькими таблицами и объединениями в запрос linq

У меня есть запрос, который мне удалось запустить в SQL Server, но я не могу запустить его в LINQ. В таблице SQL есть несколько объединений, но есть одна таблица, которая не объединяет данные, и я думаю, что здесь мой запрос LINQ терпит неудачу.

Код отлично компилируется в Visual Studio, но дает сбой при выполнении запроса. Вот мой SQL:

SELECT DISTINCT TOP (1000) 
MA_MASTER.YEAR_ID,
PC_PARCEL.P_ID, 
PC_PARCEL.TAX_MAP, 
PC_PARCEL.LEGAL_INDEX,
ISNULL(NULLIF(PC_ADDRESS.FORMATED_ADDRESS, ''), 'Unknown Address') AS FORMATED_ADDRESS,
OWNR.NA_ID, 
NA_NAMES.NAME_INDEX,
MA_MASTER.INSP_FLAG,
IIF(MA_MASTER.INSP_FLAG IS NULL, NULL, 
  (SELECT TOP 1 [GOVERNPORTALDEV].[dbo].[VT_USER].[LONG_DESC_EN] 
  FROM [GOVERNPORTALDEV].[dbo].[VT_USER] 
  WHERE MA_MASTER.INSP_FLAG = [GOVERNPORTALDEV].[dbo].[VT_USER].[CODE] 
  AND TABLE_NAME like '%ins_flag%')) AS [LONG_DESC_EN]
FROM ((GOVERNPORTALDEV.dbo.PC_PARCEL 
INNER JOIN GOVERNPORTALDEV.dbo.PC_ADDRESS
  ON GOVERNPORTALDEV.dbo.PC_PARCEL.P_ID = 
GOVERNPORTALDEV.dbo.PC_ADDRESS.P_ID) 
INNER JOIN (SELECT P_ID, Min(NA_ID) AS NA_ID FROM 
GOVERNPORTALDEV.dbo.PC_OWNER GROUP BY P_ID) AS OWNR
  ON GOVERNPORTALDEV.dbo.PC_PARCEL.P_ID = OWNR.P_ID) 
INNER JOIN GOVERNPORTALDEV.dbo.NA_NAMES 
  ON OWNR.NA_ID = GOVERNPORTALDEV.dbo.NA_NAMES.NA_ID
INNER JOIN GOVERNPORTALDEV.dbo.MA_MASTER
  ON GOVERNPORTALDEV.dbo.MA_MASTER.P_ID = GOVERNPORTALDEV.dbo.PC_PARCEL.P_ID
,[GOVERNPORTALDEV].[dbo].[VT_USER] 
WHERE [GOVERNPORTALDEV].[dbo].[PC_PARCEL].[JURISDICTION] ='MANKO' 
  AND MA_MASTER.YEAR_ID = 2018
  AND TABLE_NAME like '%ins_flag%'
  AND FROZEN_ID = 0
ORDER BY P_ID;

Вот мой запрос LINQ:

var query = from pc_parcel in Context.PC_PARCEL
    join pc_address in Context.PC_ADDRESS 
      on pc_parcel.P_ID equals pc_address.P_ID
    join ownr in Context.PC_OWNER.GroupBy(pid => new { pid.P_ID, pid.NA_ID })
      .Select(ownr => new { ownr.Key.P_ID, NA_ID = ownr.Min(m => m.NA_ID) })
                      on pc_parcel.P_ID equals ownr.P_ID
    join na_names in Context.NA_NAMES
      on ownr.NA_ID equals na_names.NA_ID
    join ma_master in Context.MA_MASTER
      on pc_parcel.P_ID equals ma_master.P_ID
    join vt_user in Context.VT_USER
      on ma_master.INSP_FLAG equals vt_user.CODE

    where pc_parcel.JURISDICTION == juris_code && 
      ma_master.YEAR_ID == year && 
      ma_master.FROZEN_ID == 0 && 
      vt_user.TABLE_NAME.Contains("ins_flag")
    orderby pc_parcel.P_ID

    select new MaintenanceListDetail
    {
        AssessmentID = pc_parcel.TAX_MAP,
        LegalLandDescription = pc_parcel.LEGAL_INDEX,
        CivicAddress = pc_address.FORMATED_ADDRESS,
        ReasonForInspection = null,
        OwnerName = na_names.NAME_INDEX,
        OwnerEmail = null,
        OwnerPhone = null,
        Status = 0
    };

Я использовал вопрос Создание LINQ select из нескольких таблиц в качестве основы для своего кода, но я не могу заставить его работать.

Вы действительно должны использовать CROSS JOIN - [GOVERNPORTALDEV].[dbo].[VT_USER] в своем запросе T-SQL, не смешивая синтаксис ANSI-89 и ANSI-92 JOIN.

Larnu 31.10.2018 13:51

Если перевод запроса в linq оказывается таким сложным, уверены ли вы, что это хорошая идея? Когда вам нужно провести техническое обслуживание, это будет сложно снова и снова ...

GuidoG 31.10.2018 14:04

@GuidoG Мне нужно вернуть запрос как объект IQueryable, потому что он является частью репозитория. Есть ли альтернатива?

Nse 31.10.2018 17:28

Нет, боюсь, что нет. Положительным моментом является то, что когда вы закончите, вы очень хорошо изучите linq.

GuidoG 31.10.2018 17:38

Возможно, мой Рецепт SQL to LINQ может помочь вам с некоторыми указателями?

NetMage 31.10.2018 19:56

Что именно означает «он вылетает»?

NetMage 31.10.2018 19:57
0
6
49
0

Другие вопросы по теме