【问题标题】:linq join with an or conditionlinq 加入 or 条件
【发布时间】:2016-06-02 22:23:40
【问题描述】:

我正在构建一个 linq 查询:

From G In Games _
            Where G.Field(Of Integer)("SystemID") = System _
            Join F In Files On _
            F.Field(Of String("Name") Equals G.Field(Of String)("PrimaryFilename") _
            Select New With {
                .gid = G.Field(Of Integer)("ID"),
                .ggamename = G.Field(Of String)("GameName")}

我希望连接发生在它等于一个值或另一个值的地方。像这样的东西(这自然是行不通的):

From G In Games _
            Where G.Field(Of Integer)("SystemID") = System _
            Join F In Files On _
            F.Field(Of String("Name") Equals G.Field(Of String)("PrimaryFilename") OR G.Field(Of String)("SafeFilename") _
            Select New With {
                .gid = G.Field(Of Integer)("ID"),
                .ggamename = G.Field(Of String)("GameName")}

我该怎么办?


更新

以下有用的建议,但结果证明交叉连接太昂贵且速度太慢。我也试过下面的方法:

Dim query1 = _
            From G In Games _
            Where G.Field(Of Integer)("SystemID") = System _
            Join F In Files On _
            G.Field(Of String)("PrimaryFilename") Equals F.Field(Of String)("Name") _
            Select New With {
                .gid = G.Field(Of Integer)("ID"),
                .ggamename = G.Field(Of String)("GameName"),
                .gprimaryfilename = G.Field(Of String)("PrimaryFilename"),
                .gsafegamename = G.Field(Of String)("SafeGameName")}

dim  query2 = _
           From G In Games _
           Where G.Field(Of Integer)("SystemID") = System _
           Join F In Files On _
           G.Field(Of String)("SafeGameName") Equals F.Field(Of String)("Name") _
            Select New With {
            .gid = G.Field(Of Integer)("ID"),
            .ggamename = G.Field(Of String)("GameName"),
            .gprimaryfilename = G.Field(Of String)("PrimaryFilename"),
            .gsafegamename = G.Field(Of String)("SafeGameName")}

Dim query = query1.Union(query2)

但这产生了一些奇怪的结果(错误的匹配)——感觉有点超出我的深度。关于如何实现简单的“或”匹配还有其他建议吗?

【问题讨论】:

    标签: vb.net linq join


    【解决方案1】:

    Linq 仅支持 equi-joins。您可以尝试进行“交叉连接”并将条件放入您的 where 子句中:

    From G In Games _
        Where G.Field(Of Integer)("SystemID") = System _
        From F In Files _
        Where (F.Field(Of String("Name") = G.Field(Of String)("PrimaryFilename")) _
           Or (F.Field(Of String("Name") = G.Field(Of String)("SafeFilename")) _
        Select New With {
            .gid = G.Field(Of Integer)("ID"),
            .ggamename = G.Field(Of String)("GameName")}
    

    【讨论】:

    • 谢谢,伙计。然而——这种方法似乎运行得非常慢——在某个地方读到交叉连接非常昂贵。我已经更新了 OP 以包含我尝试过的另一种方法。有更快的方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    相关资源
    最近更新 更多