Linq-如何在没有'join'关键字的情况下构造此查询?

Linq-如何在没有'join'关键字的情况下构造此查询?,linq,linq-to-sql,Linq,Linq To Sql,我有以下部分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 Rou

我有以下部分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
由于这些关系是使用FKs强制执行的,因此L2S知道这些关系,因此我应该能够在不使用“join”关键字的情况下构造此查询。但是,我不知道该怎么做


谢谢。

我测试了一个与您类似的场景,得到了相同的结果 您可以选择多个而不加入,例如:

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)

你到底想要线路装置吗?如果是:

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

检查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)
如果你想得到与纪尧姆86的答案相似的结果,但没有明显的。。。然后执行此子查询并筛选

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;

这就是你要找的吗?从这篇文章。看起来你已经在那里发表了评论。@Chris-我不认为这是完全一样的,我对我发表的问题的答案不是很满意。但是谢谢你。你为什么不喜欢“连接”?@Equiso-因为我不需要告诉L2S当它拥有推断连接所需的所有信息时如何连接表。当然它可以推断一个级别的关系的连接,但是如果你导航多个级别,在某个时刻,您必须告诉LINQ采取什么路径,因为您可能不想加入其他表。这并不能解决我的问题。您仍然在告诉L2如何加入表,而不必这样做。L2S拥有执行连接所需的所有信息,因为FKs已就位。