2011-03-22 48 views
0

我需要使用Linq to Entity重寫下面的查詢。有人知道如何以最充分的方式做到這一點嗎?如何使用Linq to Entity重寫SQL查詢

SELECT DISTINCT 
     C.ClientId, 
     C.CompanyName 
    FROM Application A WITH (NOLOCK) 
    INNER JOIN 
       (
       SELECT ApplicationId 
       FROM CAContracts WITH (NOLOCK) 
       WHERE ID = 1212 AND CAContractStatusId IN (2,3) 
       UNION ALL 
       SELECT OBA.ApplicationId 
       FROM OpportunityAssignment OA WITH (NOLOCK) 
       INNER JOIN OpportunityByApp OBA WITH (NOLOCK) ON 
        OBA.OpportunityId = OA.OpportunityId 
       WHERE OA.ID = 1212 
        AND OA.OpporStatusId IN (5,7) 
       ) ACPA ON 
     ACPA.ApplicationId = A.Applicationid 
    INNER JOIN Client C WITH (NOLOCK) ON 
     C.ClientId = A.ClientId 
    ORDER BY C.CompanyName 

回答

0

假設Context具有已定義爲實體的所有相關表格和有適當的關係定義:

Context.Clients 
     .Include("Applications") 
     .Include("Applications.CAContracts") 
     .Include("Applications.OpportunityAssignments") 
     .Include("Applications.OpportunityAssignments.OpportunityByApps") 
     .Where<Client>(c => (c.Applications 
          .Any<Application>(a => a.CAContracts 
                .Any<CAContract>(cac => cac.ID == 1212 && (cac.CAContractStatusId == 2 || cac.CAContractStatusId == 3))) 
         || (c.Applications 
          .Any<Application>(a => a.OpportunityAssignments 
                .Any<OpportunityAssignment>(oa => oa.ID == 1212 && (oa.OpporStatusId == 5 || oa.OpporStatusId == 7) && oa.OpportunityByApps.Any<OpportunityByApp>())))) 
     .Select(c => new { ClientId = c.ClientId, CompanyName = c.CompanyName}) 
     .Distinct() 
     .OrderBy(c => c.CompanyName); 

如果我知道更多關於架構,我也許能夠做的更好一點。您最終得到一組具有ClientId和CompanyName屬性的匿名類型;我傾向於避免匿名類型,除非相應的對象會過大。