使用额外变量的 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,否则这很容易。

使用额外变量的 Linq 多个连接条件

只是为了扩展评论:

当然,你可以只使用两个常量(或文字)?,即

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

我认为此选项应该更容易阅读。