2013-06-27 80 views
1

我不知所措,所以我來這裏看看大家對此有何看法。在多臺計算機上執行不同的實體框架

背景:使用jquery自動填充重量/ EF 5

文本框問題:實體正在執行內連接,但語法示出了左連接正在被執行。 (兩臺PC都運行Win 7和最新的框架)

異常:它在我的電腦上運行正確(左外連接)。但在我的朋友PC上,它顯示了一個內部連接。兩個文件都是二進制等於。 (實際從混帳拉)

下面是代碼:

public JsonResult AutoCompleteName(string term) 
     { 
      using (var db = new PersonnelContext()) 
      { 
       return this.Json((from r in db.Personnel 
            join per in db.PersonnelEmployee on r.Id equals per.Personnel_Id 
            join dep in db.RefDepartment on per.Department equals dep.Department into rfdp 
            from g in rfdp.DefaultIfEmpty() 
            where r.First_Name.ToLower().Contains(term.ToLower()) | r.Last_Name.ToLower().Contains(term.ToLower()) | (r.First_Name.ToLower() + " " + r.Last_Name.ToLower()).Contains(term.ToLower()) 
            select new { firstname = r.First_Name, lastname = r.Last_Name, department = g.DeptDesc ?? "None", per.Personnel_Id, per.Pernr }).OrderBy(a => a.firstname).ToArray(), JsonRequestBehavior.AllowGet); 
     } 
    } 

這裏是從PC上的IntelliTrace其中以其優良的工作:(注意我拿出一些由於保密)

FROM (SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[First_Name] AS [First_Name], 
    [Extent1].[Last_Name] AS [Last_Name], 
    [Extent2].[Personnel_Id] AS [Personnel_Id], 
    [Extent2].[Pernr] AS [Pernr], 
    CASE WHEN ([Extent3].[Dept_Desc] IS NULL) THEN N'None' ELSE [Extent3].[Dept_Desc] END AS [C1] 
    FROM [Core].[Personnel] AS [Extent1] 
    INNER JOIN [Core].[Personnel_Employee] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Personnel_Id] 
    LEFT OUTER JOIN [Core].[Ref_Department] AS [Extent3] ON [Extent2].[Department] = [Extent3].[Department] 
    WHERE ((CAST(CHARINDEX(LOWER(@p__linq__0), LOWER([Extent1].[First_Name])) AS int)) > 0) OR ((CAST(CHARINDEX(LOWER(@p__linq__1), LOWER([Extent1].[Last_Name])) AS int)) > 0) OR ((CAST(CHARINDEX(LOWER(@p__linq__2), LOWER([Extent1].[First_Name]) + N' ' + LOWER([Extent1].[Last_Name])) AS int)) > 0) 
) AS [Project1] 
ORDER BY [Project1].[First_Name] ASC" 

正如您所看到的,它正如語法所暗示的那樣執行左外連接。

這裏是從的IntelliTrace PC 2:(!完全相同的代碼)

FROM (SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[First_Name] AS [First_Name], 
    [Extent1].[Last_Name] AS [Last_Name], 
    [Extent2].[Personnel_Id] AS [Personnel_Id], 
    [Extent2].[Pernr] AS [Pernr], 
    CASE WHEN ([Extent3].[Dept_Desc] IS NULL) THEN N'None' ELSE [Extent3].[Dept_Desc] END AS [C1] 
    FROM [Core].[Personnel] AS [Extent1] 
    INNER JOIN [Core].[Personnel_Employee] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Personnel_Id] 
    INNER JOIN [Core].[Ref_Department] AS [Extent3] ON [Extent2].[Department] = [Extent3].[Department] 
    WHERE ((CAST(CHARINDEX(LOWER(@p__linq__0), LOWER([Extent1].[First_Name])) AS int)) > 0) OR ((CAST(CHARINDEX(LOWER(@p__linq__1), LOWER([Extent1].[Last_Name])) AS int)) > 0) OR ((CAST(CHARINDEX(LOWER(@p__linq__2), LOWER([Extent1].[First_Name]) + N' ' + LOWER([Extent1].[Last_Name])) AS int)) > 0) 
) AS [Project1] 
ORDER BY [Project1].[First_Name] ASC" 

這裏是另外一個陌生的異常: 當部署到QA,它適用於在PC的優良!我們沒有一致的知道發生了什麼事。

這裏的任何想法?我不知道發生了什麼事。我們已經徹底清除了我們的工作版本,並從git中重新啓動。同樣的事情發生。如果沒有人有任何想法,我們可能需要使用proc。但我至少想知道發生了什麼事情。

**編輯**答案: 我真的不知道爲什麼這個工程,但我得到它的工作。這裏是現在的查詢:

return this.Json((from r in db.Personnel 
            join per in db.PersonnelEmployee on r.Id equals per.Personnel_Id 
            where r.First_Name.ToLower().Contains(term.ToLower()) | r.Last_Name.ToLower().Contains(term.ToLower()) | (r.First_Name.ToLower() + " " + r.Last_Name.ToLower()).Contains(term.ToLower()) 
            join dep in db.RefDepartment 
            .Where(x => x.DeptDesc != null || x.DeptDesc == null) on per.Department equals dep.Department into rfdp 
            from g in rfdp.DefaultIfEmpty() 
            select new { 
             firstname = r.First_Name, 
             lastname = r.Last_Name, 
             department = (g == null) ? "None" : g.DeptDesc, 
             per.Personnel_Id, 
             per.Pernr }).ToArray(), JsonRequestBehavior.AllowGet); 

我認爲這一個工程,因爲它顯式尋找DeptDesc爲空,而不是空....我只是很高興它的工作。感謝大家看着這個。

+0

該程序是否針對兩臺機器上的相同數據庫引擎?如果是這樣,是每個數據庫的相同版本? –

+0

它們都使用完全相同的連接字符串定位相同的遠程數據庫。 – Botonomous

+0

嗯,我只是想通了。請參閱編輯以獲取答案。 – Botonomous

回答

1

我能得到這個固定以下修改後的查詢:

return this.Json((from r in db.Personnel 
            join per in db.PersonnelEmployee on r.Id equals per.Personnel_Id 
            where r.First_Name.ToLower().Contains(term.ToLower()) | r.Last_Name.ToLower().Contains(term.ToLower()) | (r.First_Name.ToLower() + " " + r.Last_Name.ToLower()).Contains(term.ToLower()) 
            join dep in db.RefDepartment 
            .Where(x => x.DeptDesc != null || x.DeptDesc == null) on per.Department equals dep.Department into rfdp 
            from g in rfdp.DefaultIfEmpty() 
            select new { 
             firstname = r.First_Name, 
             lastname = r.Last_Name, 
             department = (g == null) ? "None" : g.DeptDesc, 
             per.Personnel_Id, 
             per.Pernr }).ToArray(), JsonRequestBehavior.AllowGet); 

正如我在編輯說:我不是100%肯定,爲什麼這個工作,而不是第一個,但我很高興它!

0

這聽起來可疑像EF已經「固定」的問題... have a look at this duplicated join issue

他們指出,除去排序依據刪除重複的......值得一試吧

+0

感謝您的回覆。我刪除了orderby,它仍然在做同樣的事情:( – Botonomous

相關問題