Linq - Как построить этот запрос без ключевого слова join? - PullRequest
2 голосов
/ 09 февраля 2011

У меня есть следующий частичный запрос Linq:

var query = from ri in RouteInstance
        join rir in RouteInstanceRules on ri.RouteInstanceID equals rir.RouteInstanceID
        join rl in RoutingLocation on rir.RoutingLocationID equals rl.RoutingLocationID
        join rlh in RoutingLocationHistory on rl.RoutingLocationID equals rlh.RoutingLocationID
        where rlh.RouteTakenTime >= new System.DateTime(2011,2,4) && rlh.RouteTakenTime <= new System.DateTime(2011,2,5)

There is a 1:M relationship between RouteInstance and RouteInstanceRules
There is a 1:M relationship between RouteInstanceRules and RoutingLocation
There is a 1:M relationship between RoutingLocation and RoutingLocationHistory

Поскольку эти отношения применяются с помощью FK и, следовательно, известны L2S, я смогу создать этот запрос без использования ключевого слова join.Но я не знаю, как это сделать.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 09 февраля 2011

Вы хотите RouteInstances в конце? Если так:

var query = DataContext.RoutingLocationHistory
           .Where(rlh => rlh.RouteTakenTime >= new System.DateTime(2011,2,4) 
                        && rlh.RouteTakenTime <= new System.DateTime(2011,2,5))
           .Select(rlh => rlh.RoutingLocation.RouteInstanceRule.RouteInstance)
           .Distinct();
1 голос
/ 09 февраля 2011

Я протестировал сценарий, подобный вашему, и получил те же результаты
Вы можете выбрать несколько без объединения, например:

var query = from ri in RouteInstance
            from rir in RouteInstanceRules 
            from   rl in        RoutingLocation
            from    rlh in RoutingLocationHistory 
             where    ri.RouteInstanceID ==    rir.RouteInstanceID &&
             rir.RoutingLocationID == rl.RoutingLocationID &&
             rl.RoutingLocationID == rlh.RoutingLocationID &&
             rlh.RouteTakenTime >= new System.DateTime(2011,2,4) && rlh.RouteTakenTime <= new System.DateTime(2011,2,5)
0 голосов
/ 10 февраля 2011

Проверьте наличие ассоциаций в конструкторе dbml. Если он заметил ваши внешние ключи, он автоматически создаст ассоциации. Если нет - вы можете добавить их самостоятельно (даже если внешний ключ не существует или не применяется).

Запрашивая свойство ассоциации, вы можете скрыть детали ваших отношений.

query =
  from ri in dataContext.RouteInstances
  from rir in ri.RouteInstanceRules
  from rl in rir.RoutingLocations
  from rlh in rl.RoutingLocationHistories
  where rlh.RouteTakenTime >= new System.DateTime(2011,2,4)
    && rlh.RouteTakenTime <= new System.DateTime(2011,2,5)

Если вы хотите, чтобы результаты Guillaume86 были похожи на результаты, но без отличительных ..., тогда выполните этот фильтр подзапроса.

IQueryable<RouteInstance> query =
   from ri in dataContext.RouteInstances
   where ri.RouteInstanceRules
     .Any(rir => rir.RoutingLocations
       .Any(rl => rl.RoutingLocationHistories
         .Any(rlh => rlh.RouteTakenTime >= new System.DateTime(2011,2,4)
           && rlh.RouteTakenTime <= new System.DateTime(2011,2,5)
         )
       )
     )
   select ri;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...