使用额外变量的 Linq 多个连接条件
本文关键字:连接 条件 Linq 变量 | 更新日期: 2023-09-27 18:36:40
我有这个查询:
SELECT *
FROM transaction t
JOIN transactionDetail toTrans ON t.id = toTrans.tId and toTrans.FlowDirection= 1
JOIN transactionDetail fromTrans ON t.id = fromTrans.tId and fromTrans.FlowDirection= 0
我尝试使用匿名类型重新创建,如此处所述。
byte toFlow = 1;
byte fromFlow = 1;
from trans in data.Transactions
join toTrans in data.TransactionDetails on new {trans.id, toFlow} equals new {toTrans.tId, toTrans.FlowDirection}
join fromTrans in data.TransactionDetails on new { trans.id, fromFlow } equals new { fromTrans.tId, fromTrans.FlowDirection }
流向始终为 1 或 0,所以我使用 toFlow 字节。但是,这给出了错误:
联接子句中某个表达式的类型不正确。
根据这个答案,名称和类型都需要匹配。这意味着:
byte FlowDirection= 1;
from trans in data.Transactions
join toTrans in data.TransactionDetails on new {trans.id, FlowDirection} equals new {toTrans.tId, toTrans.FlowDirection}
join fromTrans in data.TransactionDetails on new { trans.id, FlowDirection} equals new { fromTrans.tId, fromTrans.FlowDirection }
哪个有效!但是,第二个联接需要具有值为 0 而不是 1 的流向。如何更改流向的值?我不能更改变量的名称或在匿名对象中减去 1,否则这很容易。
只是为了扩展评论:
当然,你可以只使用两个常量(或文字)?,即
from trans in data.Transactions
join toTrans in data.TransactionDetails
on new {ID = trans.id, Flow = (byte)1}
equals new {Id = toTrans.tId, Flow = toTrans.FlowDirection}
join fromTrans in data.TransactionDetails
on new { Id = trans.id, Flow = (byte)0}
equals new { Id = fromTrans.tId, Flow = fromTrans.FlowDirection }
FlowDirect- 1 不能工作,因为它将 FlowDirect 变成了一个 int?从字节中减去 int 会把字节变成 int 吗?否则,我真的不知道为什么你的代码有效。
是的,您需要将结果转换回字节(或将文字1
转换为byte
以便使用字节运算符"-")
如何更改流向的值?我无法更改变量的名称或在匿名对象中减去 1
要更改匿名对象中的变量,只需执行以下操作:
new { fromTrans.tId, FlowDirection = fromTrans.FlowDirection - 1 }
例如。
另一个想法:
from trans in data.Transactions
join toTrans in data.TransactionDetails on trans.id equals new toTrans.tId
join fromTrans in data.TransactionDetails on trans.id equals fromTrans.tId
where toTrans.FlowDirection == 1 && fromTrans.FlowDirection == 1
我认为此选项应该更容易阅读。