Как переписать SQL-запрос, используя Linq to Entity - PullRequest
0 голосов
/ 22 марта 2011

Мне нужно переписать запрос ниже, используя Linq to Entity. Кто-нибудь знает, как это сделать наиболее подходящим способом?

   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

1 Ответ

0 голосов
/ 22 марта 2011

Предполагая, что 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; Я склонен избегать анонимных типов лично, если соответствующий объект не был бы чрезмерно большим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...