c# - 此 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
最后两个连接到fp
andfx
是问题,但我不清楚有什么问题,它似乎不喜欢&&
但没有and
关键字,比如有一个equals
替换=
.
我select
已从 LINQ 中删除了该部分,因为它与问题无关,并且我想避免花费更多时间混淆表和字段名称。
解决方案
“连接子句执行等值连接。换句话说,您只能根据两个键的相等性进行匹配。不支持其他类型的比较,例如“大于”或“不等于”。为了明确所有连接都是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
推荐阅读
- postgresql - 将一些 PostgreSQL DBMS 数据从表加载到 csv 文件
- python - predictor.classify_image(project.id, publish_iteration_name, image_contents.read()) 导致无效迭代
- google-tag-manager - 带有 Chrome 隐私更改的 GTM 未来支持
- android - 为 React Native 运行 Android 模拟器
- visual-studio - 在没有鼠标或键盘箭头的情况下滚动 Visual Studio 解决方案资源管理器
- c# - 如何为 DatePicker 创建自定义渲染器(圆角、背景颜色等)
- python - 运行回归后,如何摆脱获得负系数的列并使用剩余的列重新运行回归?使用 Python
- visual-studio-code - 如何设置工作区中文件夹之间的依赖关系?
- flutter - flutter_ffmpeg 包名
- vb.net - VB.net HTTP POST 请求