Делаем вещи более краткими, используя linq для сущностей для внутренних объединений - PullRequest
2 голосов
/ 22 ноября 2011

Есть ли способ сделать это менее многословным?

var model =
(
    from MvrTable in
    LinqEntitiesCtx.Mvrs

    join MvrMedsTable in LinqEntitiesCtx.MvrMeds
    .Where(Id => Id.FKMvrId == 1)//inner join will be fast with this!

    on MvrTable.PKMvrId equals MvrMedsTable.FKMvrId

    join MvrLocationTable in LinqEntitiesCtx.MvrLocations
    on MvrTable.PKMvrId equals MvrLocationTable.FKMvrId

    join MvrEmployeeTable in LinqEntitiesCtx.MvrEmployees
    on MvrTable.PKMvrId equals MvrEmployeeTable.FKMvrId

    //notice i am using a different primary key that previouslly
    join MvrMedsAdminRouteTable in LinqEntitiesCtx.MvrMedsAdminRoutes
    on MvrMedsTable.PKMvrMedsId equals MvrMedsAdminRouteTable.FKMvrMedsId

    select new
    { //here I choose the columns I want to display
       MvrTable.PKMvrId,
       MvrTable.VarianceDescription,
       MvrTable.CaseNumber,
       MvrTable.DateOfReport,
       MvrTable.DateOfVariance
    }
);

Эквивалентный код SQL выше:

SELECT [t0].[PKMvrId], [t0].[VarianceDescription], [t0].[CaseNumber], [t0].[DateOfReport], [t0].[DateOfVariance], [t1].[PKMvrMedsId]
FROM [Mvrs] AS [t0]
INNER JOIN [MvrMeds] AS [t1] ON ([t0].[PKMvrId]) = [t1].[FKMvrId]
INNER JOIN [MvrLocations] AS [t2] ON ([t0].[PKMvrId]) = [t2].[FKMvrId]
INNER JOIN [MvrEmployees] AS [t3] ON [t0].[PKMvrId] = [t3].[FKMvrId]
INNER JOIN [MvrMedsAdminRoutes] AS [t4] ON ([t1].[PKMvrMedsId]) = [t4].[FKMvrMedsId]
WHERE [t1].[FKMvrId] =ParamMvrId

Ответы [ 2 ]

1 голос
/ 22 ноября 2011

Используя Ассоциации , это можно было бы написать более компактно. Нечто подобное (не полное):

var model =  from MvrTable in LinqEntitiesCtx.Mvrs
             where MvrTable.MvrMeds.MvrLocations.Any() //These are the Associations
             select new
             {
               MvrTable.PKMvrId,
               MvrTable.VarianceDescription,
               MvrTable.CaseNumber,
               MvrTable.DateOfReport,
               MvrTable.DateOfVariance
             };

Вам действительно не нужны объединения, поскольку вы не получаете никаких данных из этих таблиц. Вместо этого вы должны использовать Any, что соответствует SQL EXISTS.

0 голосов
/ 22 ноября 2011

Я думаю, что изменение join на from сделает это более ясным. Вы также можете сократить псевдоним вашей организации

var model =
(
    from MvrTable in LinqEntitiesCtx.Mvrs
    from MvrMedsTable in LinqEntitiesCtx.MvrMeds
                                        .Where(Id => Id.FKMvrId == 1)
                                        .Where(x => MvrTable.PKMvrId == x.FKMvrId)
    from MvrLocationTable in LinqEntitiesCtx.MvrLocations
                                            .Where(x => MvrTable.PKMvrId  == x.FKMvrId)
    from MvrEmployeeTable in LinqEntitiesCtx.MvrEmployees
                                            .Where(x => MvrTable.PKMvrId == x.FKMvrId)  
    from MvrMedsAdminRouteTable in LinqEntitiesCtx.MvrMedsAdminRoutes
                                                  .Where(x => MvrMedsTable.PKMvrMedsId == x.FKMvrMedsId)
    select new
    { 
       MvrTable.PKMvrId,
       MvrTable.VarianceDescription,
       MvrTable.CaseNumber,
       MvrTable.DateOfReport,
       MvrTable.DateOfVariance
    }
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...