代码之家  ›  专栏  ›  技术社区  ›  Ahmad

sql正常工作时,Linq查询不工作

  •  1
  • Ahmad  · 技术社区  · 8 年前

    我正在将一些SQL查询转换为Linq(实体框架)。大多数查询都运行良好,但我在下面的查询中几乎没有遇到问题。

    当我在SQLServerManagementStudio中尝试此查询时,它会返回多条记录。

    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()
                            };
    

    它不返回任何记录,只返回一个空数组。

    2 回复  |  直到 8 年前
        1
  •  3
  •   Community Reversed Engineer    7 年前

    问题显然出现在以下连接条件中

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

    这并不等同于SQL查询。

    不幸的是,EF不支持字符串到数字的数据转换,所以您的尝试是好的,但当字符串值包含前导零时,就不起作用了。

    为了使其工作,您需要用零填充 codeInspectionType.InspectionTypeID.ToString() ,可以使用 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)
    
        2
  •  0
  •   Mehmet    8 年前

    尝试在连接行的末尾添加“into[别名]”。 然后使用该别名添加from行 之后,在where行中使用该别名

    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