【问题标题】:Convert complex nested selects in Entity Framework query在实体框架查询中转换复杂的嵌套选择
【发布时间】:2018-03-18 09:57:09
【问题描述】:

我需要通过这个视图模型在视图中创建一个表:

public class ApplicationContentViewModel
{
    public BPMSPARS.Models.MySql.application application {get; set;}
    public BPMSPARS.Models.MySql.content content { get; set; }
    public BPMSPARS.Models.MySql.app_delegation app_delegation { get; set; }
}

但是创建新表的查询非常复杂。 我在 MySQL 中使用了这个查询,使用它可以得到正确的结果。

SELECT APP_UID, (SELECT CON_VALUE FROM content WHERE CON_CATEGORY = 'PRO_TITLE' AND CON_ID = 
(SELECT PRO_UID from app_delegation WHERE del_thread_status='open' and USR_UID = '00000000000000000000000000000001' AND APP_UID = '9134216305aaaea1b67c4e2096663219')) AS TASK_NAME, 
(SELECT CON_VALUE FROM content WHERE CON_CATEGORY = 'TAS_TITLE' AND CON_ID = 
(SELECT TAS_UID from app_delegation WHERE del_thread_status='open' and USR_UID = '00000000000000000000000000000001' AND APP_UID = '9134216305aaaea1b67c4e2096663219')) AS PROCESS_NAME FROM app_delegation 
WHERE del_thread_status='open' and USR_UID = '00000000000000000000000000000001' AND APP_UID = '9134216305aaaea1b67c4e2096663219'

但是,我必须将此查询转换为 linq 或 MVC 中的 EF。

如何在实体框架查询中编写此查询? 以及如何在视图中显示结果?

【问题讨论】:

  • 是否需要补充信息?
  • 如果那是你的 usr_id,我就不用管这个了

标签: mysql asp.net-mvc entity-framework linq nested-select


【解决方案1】:

您的 SQL 查询对我来说似乎(非常)特别,因为它非常多余。我将假设子查询返回单个值并使用 LINQ 强制执行它。

首先我提取了app_delegation 上的公共子查询:

var USR_APP_Delegation = from a in app_delegation
                         where a.del_thread_status == "open" &&
                               a.USR_UID == "00000000000000000000000000000001" &&
                               a.APP_UID == "9134216305aaaea1b67c4e2096663219"
                         select a;

在 LINQ 中,很容易将两个 UID 查询合并为一个查询:

var UIDs = (from a in USR_APP_Delegation
            select new { a.PRO_UID, a.TAS_UID })
           .Single();

现在你可以做名字子查询了:

var TASK_NAME = (from c in content
                 where c.CON_CATEGORY == "PRO_TITLE" &&
                 c.CON_ID == UIDs.PRO_UID
                 select c.CON_VALUE)
                .Single();

var PROCESS_NAME = (from c in content
                    where c.CON_CATEGORY == "TAS_TITLE" &&
                    c.CON_ID == UIDs.TAS_UID
                    select c.CON_VALUE)
                   .Single();

然后您可以将所有查询放在一起以获得最终结果:

var ans = (from a in USR_APP_Delegation
           select new {
               a.APP_UID,
               TASK_NAME,
               PROCESS_NAME
           })
          .Single();

再次,这表明您的例如当您确切知道它是什么时返回 APP_UID,并且您将 TASK_NAMEPROCESS_NAME 组合成一个查询而没有真正的优势。

我建议将joincontent 结合使用可以使查询更易于理解(即使在SQL 中),并且更清楚返回的内容:

var names = from a in app_delegation
            join cpro in content on new { CON_ID = a.PRO_UID, CON_CATEGORY = "PRO_TITLE" } equals new { cpro.CON_ID, cpro.CON_CATEGORY }
            join ctas in content on new { CON_ID = a.PRO_UID, CON_CATEGORY = "TAS_TITLE" } equals new { ctas.CON_ID, ctas.CON_CATEGORY }
            where a.del_thread_status == "open" &&
                  a.USR_UID == "00000000000000000000000000000001" &&
                  a.APP_UID == "9134216305aaaea1b67c4e2096663219"
            select new {
                a.APP_UID,
                Task_Name = ctas.CON_VALUE,
                Process_Name = cpro.CON_VALUE
            };

【讨论】:

  • 如何通过 foreach 循环在视图中显示这些项目?我将 ans 传递给视图。
  • 根据你在做什么,你不需要循环,例如您可以使用 names 作为中继器或网格或其他任何东西的数据源。
  • 您能通过示例在视图中显示此项目吗?
  • 我建议再问一个问题。这太宽泛了,无法回答。
猜你喜欢
  • 2020-09-24
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-16
  • 2014-05-19
  • 1970-01-01
相关资源
最近更新 更多