我不知所措,所以我來這裏看看大家對此有何看法。在多臺計算機上執行不同的實體框架
背景:使用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爲空,而不是空....我只是很高興它的工作。感謝大家看着這個。
該程序是否針對兩臺機器上的相同數據庫引擎?如果是這樣,是每個數據庫的相同版本? –
它們都使用完全相同的連接字符串定位相同的遠程數據庫。 – Botonomous
嗯,我只是想通了。請參閱編輯以獲取答案。 – Botonomous