Linq-如何在没有'join'关键字的情况下构造此查询?
我有以下部分Linq查询: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
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已就位。