與在 efcore 中加入記憶體表的大多數問題相反,我的目標不是減少回傳的記錄數量,而是實際增加它。
我有一個具有ins和outs屬性的物件。
由于它所在的專案,這些論文需要在同一個物件中。但就我而言,我需要將這兩個屬性視為單獨的物體。(有點像您將如何在 excel 的資料透視表中使用它們)
我的直接目標是將其轉換{ins:x, outs:y}為兩行:{type:'ins', value:x}和{type:'outs', value:y}
我需要它們分開的原因是因為我后來根據型別以不同的方式加入其他表。
在 SQL 中,這就是我要做的事情:
SELECT CASE WHEN t.type = 'ins' THEN d.ins ELSE d.outs END, t.type
FROM Data d
JOIN (VALUES ('ins'), ('outs')) as t (type) on 1=1;
(VALUES (1,0), (3,5)) as d (ins, outs)而不是Data d可以作為一個例子。
我需要用 linq 來“復制”所有行(附加特定資料)。
這些行隨后用于進行其他連接。
我想要的是這樣的:
var q = from d in data
from type in new string[] {"ins","outs"}
select new {type, value = (type == "ins" ? d.ins : d.outs)}
但它無效。
我得到的錯誤是:
LINQ 運算式 'd => string[] { "ins", "outs", }' 無法翻譯。以可翻譯的形式重寫查詢,或通過插入對“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的呼叫,顯式切換到客戶端評估。有關詳細資訊,請參閱https://go.microsoft.com/fwlink/?linkid=2101038。
在外面創建陣列不會改變任何東西,錯誤保持不變(好吧,錯誤中的運算式發生了變化,但不是主要訊息本身)
有沒有辦法做到這一點 ?或者我除了在包含我的資料庫中創建一個虛擬表之外別無選擇,ins并且outs可以直接進行連接(如果這是唯一的選擇,添加它的最佳方法是什么?)
uj5u.com熱心網友回復:
嗨,歡迎來到 StackOverflow 社區!
您走在正確的道路上,您只需要更正代碼中的一件事:
問題是您沒有以匿名型別命名包含資料的變數:
var q = from d in data
from type in new string[] {"ins","outs"}
select new {
type,
datas = type == "ins" ? d.ins : d.outs
};
編輯:
錯誤是說創建的字串陣列無法翻譯成SQL語言...
我認為“資料”表也在記憶體中,但我認為你不能將“具體”(db)表與記憶體中的表連接起來,所以我建議在加入呼叫 ToList() 之前強制 linq 加載資料db 表(如錯誤所示):
var q = from d in Data.Tolist()
from type in new string[] {"ins","outs"}
select new {
type,
value = type == "ins" ? d.ins : d.outs
};
如果將整個表加載到記憶體中是一個問題,您可以在資料庫中創建“輸入/輸出”表并加入它...
uj5u.com熱心網友回復:
我建議擴展linq2db.EntityFrameworkCore(免責宣告:我是創建者之一)。
查詢中的任何內容都不應更改,只需添加 call ToLinqToDB():
var q = from d in data
from type in new string[] {"ins","outs"}
select new {type, value = (type == "ins" ? d.ins : d.outs)};
q = q.ToLinqToDB();
它應該創建所需的 SQL。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/337295.html
