[英]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.