2010-03-25 4 views
2

J'ai une jointure OUTPUT EXTERNE GAUCHE dans LINQ qui se combine avec la condition de jointure externe et ne fournit pas les résultats souhaités. Cela limite fondamentalement mon résultat GAUCHE avec cette combinaison. Voici le LINQ et le SQL qui en résulte. Ce que je voudrais, c'est que "AND ([t2]. [EligEnd] = @ p0" dans la requête LINQ ne fasse pas partie de la condition de jointure mais plutôt une sous-requête pour filtrer les résultats AVANT la jointureOUFT OUTER JOIN dans Linq - Comment forcer

avance (échantillons tirés de LINQPad) - Doug

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

Voici le 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] 

Répondre

1

résultant Je ne sais pas si cela va changer le jeu de résultats avec « ET ([t2] [. EligEnd] = @ p0 "dans le cadre de la sous-requête plutôt que de la condition de jointure. Une chose que j'aime faire avec x requêtes peuvent vous aider ici. J'aime les casser en plus petites requêtes avant de les combiner. L'exécution différée de LINQ nous permet de faire plusieurs déclarations avec un appel éventuel à la base de données. Quelque chose comme ceci:

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 

Décomposant comme ça peut le rendre plus facile à déboguer, et peut-être il peut dire LINQ mieux ce que vous avez l'intention.

+0

Briser les étapes de bébé a bien fonctionné – dodegaard

1

Le code a ressemblé à ceci. RecodePopulation et RecordRegistration sont juste des méthodes pour traduire les valeurs de la requête.

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