2016-06-19 4 views
1

Я конвертирую некоторые SQL-запросы в Linq (Entity Framework). Большинство запросов работают нормально, но я столкнулся с небольшими проблемами со следующим.Запрос Linq не работает, пока sql работает правильно

Когда я пытаюсь выполнить этот запрос в SQL Server Management Studio, он возвращает несколько записей.

SELECT 
    bDrillDown, 
    Icon 
FROM 
    dbo.Checklist 
INNER JOIN 
    dbo.Codes ON Checklist.iCodeID = Codes.iCodeID 
       AND Codes.bDeleted = 0 AND Codes.bObsolete = 0 
INNER JOIN 
    dbo.CodeGroup ON Codes.iGroupID = CodeGroup.iGroupID 
        AND CodeGroup.bDeleted = 0 AND CodeGroup.bInspection = 1 
INNER JOIN 
    dbo.CodeInspectionTypeV ON Cast(LEFT(Checklist.LongKey, 6) as int) = CodeInspectionTypeV.InspectionTypeID 
WHERE 
    Checklist.bDeleted = 0 
ORDER BY 
    iChecklistID 

Когда я преобразовать его в LINQ запрос, как:

var checkList = from checklist in db.Checklists 
       join code in db.Codes on checklist.iCodeID equals code.iCodeID 
       where code.bDeleted == false && code.bObsolete == false 
       join codeGroup in db.CodeGroups on code.iGroupID equals codeGroup.iGroupID 
       where codeGroup.bDeleted == false && codeGroup.bInspection == true 
       join codeInspectionType in db.CodeInspectionTypeVs on checklist.LongKey.Substring(0, 6) equals codeInspectionType.InspectionTypeID.ToString() 
       where checklist.bDeleted == false 
       orderby checklist.iChecklistID 
       select new 
         { 
          checklist.iChecklistID, 
          InspectionTypeID = checklist.LongKey.Substring(0, 6).ToString() 
         }; 

Он не возвращает никаких записей, только пустой массив.

+1

Отлаживайте код, начиная с одного соединения, а затем добавляйте два других соединения, чтобы узнать, где код идет не так. – jdweng

+0

Во время отладки, весь запрос Linq выполняется один раз. что мне делать? – user3253756

+0

Что такое ** тип ** (1) 'checklist.LongKey' (2)' codeInspectionType.InspectionTypeID'? –

ответ

3

Проблема, видимо, в следующем присоединиться состоянии

on checklist.LongKey.Substring(0, 6) equals 
    codeInspectionType.InspectionTypeID.ToString() 

, которая не эквивалентна запрос SQL.

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

Чтобы заставить его работать, вам нужно левой колодки с нулями является результатом codeInspectionType.InspectionTypeID.ToString(), что можно сделать (по крайней мере, в последнем EF6.1.3), используя каноническую функцию DbFunctions.Right (по аналогии с how to sort varchar column containing numeric values with linq lambdas to Entity):

on checklist.LongKey.Substring(0, 6) equals 
    DbFunctions.Right("00000" + codeInspectionType.InspectionTypeID, 6) 
0

Попробуйте добавить «в [имя псевдонима]» в конце строки соединения. После этого добавьте из строки, используя это имя-псевдоним после этого использовать это имя-псевдоним в где линии

from checklist in db.Checklists 
join code in db.Codes on checklist.iCodeID equals code.iCodeID into Temp1 
from t1 in Temp1 
where t1.bDeleted == false && t1.bObsolete == false