首页 > 解决方案 > 带有多选和子查询的 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 ....");

有没有办法做到这一点?

在此先感谢,朱利安

标签: c#postgresqlentity-frameworkentity-framework-core

解决方案


我能够解决我的问题。我发布这个答案,希望它能帮助其他有类似问题的人。解决方案只是添加.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();

推荐阅读