我在 PostgreSQL 中有一個相當簡單的嵌套“case-when-then-end”查詢,我一直在嘗試將其轉換為 LINQ,但沒有成功。基本上,我正在檢查案例 1:節點表中的 ID 是否與許可證表中的產品 ID 具有 Type1 關系和 Type2 關系或案例 2:它是否與許可證表中的 Type3 product_id 相關。在下面的查詢中,如果找到具有 Type1 許可證的行和具有 Type2 許可證的另一行,則回傳 Status1。如果找到一行具有 Type3 許可證,它將回傳 Status2。我希望這是一個足夠清楚的解釋。在 PostgreSQL 中非常簡單,但我是 LINQ 的新手,需要一些幫助,我將不勝感激。
SELECT n.id,
(CASE WHEN EXISTS (SELECT 1
FROM admin.license l
WHERE l.product_id = 'Type1' and l.node_id = n.id
)
THEN (CASE WHEN EXISTS (SELECT 1
FROM admin.license l
WHERE l.product_id = 'Type2' and l.node_id = n.id
)
THEN 'Status1' end )
else
(CASE WHEN EXISTS (SELECT 1
FROM admin.license l
WHERE l.product_id = 'Type3' and l.node_id = n.id
)
THEN 'Status2'
END)
END) as Status
FROM admin.node n
join admin.bundle_node bn on n.id = bn.node_id where bn.bundle_id = 11
order by n.id asc;
到目前為止,我在 LINQ 中的嘗試如下所示:
var result = (from l in Licenses
join n in Nodes on l.NodeId equals n.Id
join bn in BundleNodes on n.Id equals bn.NodeId
join b in Bundles on bn.BundleId equals b.Id
where b.Id == id select new
{
Id = bn.NodeId,
Status = **Hardware or Software depending on Case statement**
});
此代碼用作 if else if 陳述句,但我無法嵌套它:
Text =
(
n == 1 ? "One" :
n == 2 ? "Two" :
n == 3 ? "Three" : "Unknown"
)
我不知道如何嵌套它,假設它與嵌套 CASE WHEN THEN END 陳述句的效果相同。
uj5u.com熱心網友回復:
您可以使用嵌套的三元運算子,就在從CASE WHEN...翻譯時,END您必須意識到默認結果是NULL:
from n in Nodes
join bn in BundleNodes on n.Id equals bn.BundleId
where bn.BundleId == id
select new {
n.Id,
Status = (Licenses.Where(l => l.ProductId == "Type1" && l.NodeId == n.Id).Any()
? (Licenses.Where(l => l.ProductId == "Type2" && l.NodeId == n.Id).Any()
? "Status1"
: null)
: (Licenses.Where(l => l.ProductId == "Type3" && l.NodeId == n.Id).Any()
? "Status2"
: null)
)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/522818.html
標籤:林克案子
