首页 > 解决方案 > 此 LINQ 查询中的联接有什么问题?

问题描述

我正在尝试在 LINQ 中复制以下 SQL 查询:

SELECT *
FROM Table1 AS D INNER JOIN Table2 AS DV ON D.Table1Id = DV.Table1Id
                 INNER JOIN Table3 AS VT ON DV.Table3Id = VT.Table3Id
                 INNER JOIN Table4 AS C ON DV.CurrencyId = C.CurrencyId
                 INNER JOIN Table5 AS FP ON DV.DVDate BETWEEN FP.StartDate AND FP.EndDate
                 INNER JOIN Table6 AS FX ON DV.CurrencyId = FX.FromCurrencyId AND FX.ToCurrencyId = 'USD' AND FX.FiscalPeriodId = FP.FiscalPeriodId

这就是我在 LINQ 中所拥有的:

from d in db.Table1
join dv in db.Table2 on d.Table1Id equals dv.Table1Id
join vt in db.Table3 on dv.Table3Id equals vt.Table3Id
join c in db.Table4 on dv.CurrencyId equals c.CurrencyId
join fp in db.Table5 on dv.DVDate >= fp.StartDate && dv.DVDate <= fp.EndDate //error on this line
join fx in db.Table6 on dv.CurrencyId equals fx.FromCurrencyId && fx.ToCurrencyId equals "USD" && fx.FiscalPeriodId equals fp.FiscalPeriodId //error also on this line

最后两个连接到fpandfx是问题,但我不清楚有什么问题,它似乎不喜欢&&但没有and关键字,比如有一个equals替换=.

select已从 LINQ 中删除了该部分,因为它与问题无关,并且我想避免花费更多时间混淆表和字段名称。

标签: c#.netlinq

解决方案


“连接子句执行等值连接。换句话说,您只能根据两个键的相等性进行匹配。不支持其他类型的比较,例如“大于”或“不等于”。为了明确所有连接都是equijoins,join 子句使用 equals 关键字而不是 == 运算符。"

参考:https ://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/join-clause

您需要在where子句中执行此操作。像这儿:

https://stackoverflow.com/a/3547706/3058487

要使用复合键进行连接,您需要执行以下操作:

new { dv.CurrencyId, fp.FiscalPeriodId } equals new { CurrencyId = fx.ToCurrencyId, fx.FiscalPeriodId }

参考: https ://docs.microsoft.com/en-us/dotnet/csharp/linq/join-by-using-composite-keys


推荐阅读