c# - 带有多选和子查询的 EF Core CROSS JOIN
问题描述
我在使用CROSS JOIN
两个表和结果中的子查询编写 LINQ 查询时遇到问题。
我将向您展示我所做的 SQL 查询,它在我的 PostgreSQL 服务器中运行:
SELECT t2.id, t1.id,
(
SELECT COALESCE(avg(t3.value), -1)
FROM table3 t3
LEFT JOIN table4 t4 ON t4.id = t3.tag_id
LEFT JOIN table5 t5 ON t5.id = t4.device_id
LEFT JOIN table6 t6 ON t6.id = t4.system_id
WHERE t4.tag_type_id = 171 --TT Value
AND t1.id = ANY(t4.control_area)
AND t6.zone_id = t2.id
)
FROM table1 t1
CROSS JOIN table2 t2
ORDER BY t2.z_index,t1.d_index
我现在尝试在 EF Core 代码中复制这个查询,这就是我目前得到的:
var ss = ctx.Table1.SelectMany(
t1 => ctx.Table2,
(t1, t2) => new
{
T1 = t1.Id,
T2 = t2.Id,
Value = ctx.Table3
.Include(s => s.Table4.Table5.Table6)
.Where(s => s.Table4.TagTypeId == 171
&& s.Table4.Table5.ControlArea.Any(a => a == t1.Id)
&& s.Table4.Table5.Table6.Zone == t2.Id)
}).ToList();
当我运行它时,我收到以下错误:
Unable to cast object of type 'System.Linq.Expressions.MethodCallExpression2' to type
'System.Linq.Expressions.LambdaExpression'.
我不确定如何在不使用的情况下完成此操作ctx.Database.ExecuteSqlRaw("SELECT ....");
有没有办法做到这一点?
在此先感谢,朱利安
解决方案
我能够解决我的问题。我发布这个答案,希望它能帮助其他有类似问题的人。解决方案只是添加.Average(s=>s.Value)
到子查询的末尾。
像这样的东西:
var ss = ctx.Table1.SelectMany(
t1 => ctx.Table2,
(t1, t2) => new
{
T1 = t1.Id,
T2 = t2.Id,
Value = ctx.Table3
.Include(s => s.Table4.Table5.Table6)
.Where(s => s.Table4.TagTypeId == 171
&& s.Table4.Table5.ControlArea.Any(a => a == t1.Id)
&& s.Table4.Table5.Table6.Zone == t2.Id).Average(s=>s.Value)
}).ToList();
推荐阅读
- php - 更改数组数组的索引名称
- javascript - RegExp 在数组中查找值
- javascript - 文件夹路径 - 绝对文件夹路径
- sql - 合并两个匹配值的查询结果
- shell - 如何计算 tar.gz 几个文件的行数而不解压缩并打印出文件名和行数?
- android - 针对应用程序组件工厂的清单合并失败
- r - Reshape from wide to long in R where id and value of id are in the same row
- lotus-notes - DXL导入后如何编译Java代码?
- python - 如何更改 django 字段标签文本以重置密码?
- javascript - 在 Electron 中禁用 nodeIntegration 有什么限制?