使用LINQ和F#进行非等连接

4

我正在尝试使用LINQ和F#以大于号运算符连接两个表。这个问题与此处链接所问的问题基本相同,但是使用的是F#而不是C#。

在我的情况下,我有一个SQL Server数据库中的两个表:intervalstimelines,它们都有start_timeend_time字段。

我需要在这两个表上执行非等值连接,匹配每个表中的开始和结束时间。我尝试以下方法实现:

let dc = new TypedDataContext()

let qry = 
query {
    for i in dc.intervals do 
    join t in dc.timelines on 
      (t.start_time > i.start_time && t.start_time < i.end_time)
    select (i, t)
}

但是这很容易失败,并出现以下错误:

在“join”中无效的连接关系。期望“expr expr”,其中 是 =、=?、?= 或 ?=?。


2
为什么不像C#答案那样使用两个for和一个where,而不是使用join - ildjarn
谢谢你,ildjarn。我确实尝试过类似的东西,但是使用了错误的语法。 - Russell
2个回答

4
尽管F# LINQ文档没有提到,但是C#文档(第二段)指出使用join关键字的连接始终是等值连接。可以安全地假设行为在两种语言中是一致的。@ildjarn建议使用解决方法

3
你需要使用交叉连接/SelectMany(两个for循环)和一个where子句。 例如:
let results = query {
    for i in dc.intervals do 
    for t in dc.timelines do
    where (t.start_time > i.start_time && t.start_time < i.end_time)
    select (i, t)
}

谢谢。这正是我想要的。在我的尝试中,我忽略了WHERE子句,或者试图使用错误的语法来使用它。 - Russell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接