[英]EFcore Joining InMemory Table for duplication of entry
與在 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
有加盟可以直接(如果這是唯一的選擇,這將是補充,最好的辦法?)
嗨,歡迎來到 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
};
如果將整個表加載到內存中是一個問題,您可以在數據庫中創建“輸入/輸出”表並加入它...
我建議擴展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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.