2013-06-27 83 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

相关问题