2010-03-25 26 views
2

我在LINQ中有一個LEFT OUTER OUTER連接,它與外部連接條件相結合而不提供所需的結果。這基本上限制了我的左側結果。這裏是LINQ和生成的SQL。我想要的是「AND([t2]。[EligEnd] = @ p0」在LINQ查詢中不是要加入連接條件的一部分,而是在加入之前過濾結果的子查詢Linq中的左外部連接 - 如何強制

Thanks in提前(從LINQPad拉樣品) - 道格

(from l in Users 
         join mr in (from mri in vwMETRemotes where met.EligEnd == Convert.ToDateTime("2009-10-31") select mri) on l.Mahcpid equals mr.Mahcpid into lo 
         from g in lo.DefaultIfEmpty() 
         orderby l.LastName, l.FirstName 
         where l.LastName.StartsWith("smith") && l.DeletedDate == null 
         select g) 

這裏是生成的SQL

-- Region Parameters 
DECLARE @p0 DateTime = '2009-10-31 00:00:00.000' 
DECLARE @p1 NVarChar(6) = 'smith%' 
-- EndRegion 
SELECT [t2].[test], [t2].[MAHCPID] AS [Mahcpid], [t2].[FirstName], [t2].[LastName], [t2].[Gender], [t2].[Address1], [t2].[Address2], [t2].[City], [t2].[State] AS [State], [t2].[ZipCode], [t2].[Email], [t2].[EligStart], [t2].[EligEnd], [t2].[Dependent], [t2].[DateOfBirth], [t2].[ID], [t2].[MiddleInit], [t2].[Age], [t2].[SSN] AS [Ssn], [t2].[County], [t2].[HomePhone], [t2].[EmpGroupID], [t2].[PopulationIdentifier] 
FROM [dbo].[User] AS [t0] 
LEFT OUTER JOIN (
    SELECT 1 AS [test], [t1].[MAHCPID], [t1].[FirstName], [t1].[LastName], [t1].[Gender], [t1].[Address1], [t1].[Address2], [t1].[City], [t1].[State], [t1].[ZipCode], [t1].[Email], [t1].[EligStart], [t1].[EligEnd], [t1].[Dependent], [t1].[DateOfBirth], [t1].[ID], [t1].[MiddleInit], [t1].[Age], [t1].[SSN], [t1].[County], [t1].[HomePhone], [t1].[EmpGroupID], [t1].[PopulationIdentifier] 
    FROM [dbo].[vwMETRemote] AS [t1] 
    ) AS [t2] ON ([t0].[MAHCPID] = [t2].[MAHCPID]) AND ([t2].[EligEnd] = @p0) 
WHERE ([t0].[LastName] LIKE @p1) AND ([t0].[DeletedDate] IS NULL) 
ORDER BY [t0].[LastName], [t0].[FirstName] 

回答

1

我不知道這是否會改變這一結果與「設定AND([T2] [。 EligEnd] = @ p0「作爲子查詢的一部分,而不是連接條件。我喜歡做的一件事是完成x查詢可能會幫助你。在結合它們之前,我喜歡將它們分解爲更小的查詢。 LINQ的推遲執行讓我們可以通過一次最終調用數據庫來完成多個語句。這樣的事情:

var elig = from mri in vwMETRemotes 
      where met.EligEnd == Convert.ToDateTime("2009-10-31") 
      select mri; 

var users = from l in Users 
      where l.LastName.StartsWith("smith") 
      where l.DeletedDate == null 

var result = from l in users 
      join mr in elig on l.Mahcpid equals mr.Mahcpid into lo 
      from g in lo.DefaultIfEmpty() 
      orderby l.LastName, l.FirstName 
      select g 

這樣分解可以使調試更容易,也許它可以更好地告訴LINQ你打算什麼。

+0

打破嬰兒步驟運作良好 – dodegaard 2010-03-25 23:02:27

1

代碼最終看起來像這樣。 RecodePopulation和RecordRegistration只是翻譯查詢中值的方法。

  var elig = from mri in db.MetRemote 
        where mri.EligEnd == Convert.ToDateTime(ConfigurationManager.AppSettings["EligibilityDate"]) 
        orderby mri.EligEnd 
        select mri; 

     var users = from l in db.Users 
        where l.LastName.StartsWith(filter) 
        where l.DeletedDate == null 
         select l; 

     var results = (from l in users 
        join m in elig on l.MahcpId equals m.MAHCPID into lo 
        from g in lo.DefaultIfEmpty() 
        orderby l.LastName, l.FirstName 
         select new UserManage() 
         { 
          Username = l.Username, 
          FirstName = l.FirstName, 
          LastName = l.LastName, 
          DateOfBirth = l.DOB, 
          Gender = l.Gender, 
          Status = RecodePopulation(g.Population, l.CreatedDate), 
          UserId = l.Id, 
          WellAwardsRegistered = RecodeRegistration(l.Id, 1) 

         }).Distinct().OrderBy(a => a.LastName).ThenBy(n => n.FirstName).Skip((currentPage - 1) * resultsPerPage).Take(resultsPerPage);