【问题标题】:C# Linq to Entities - Multiple joins on the same tableC# Linq to Entities - 同一个表上的多个连接
【发布时间】:2013-11-25 13:57:25
【问题描述】:

我需要根据以下条件从数据库表中获取行组:

  1. 按用户输入过滤
  2. 与过滤结果相对应的组

我尝试了几个解决方案的想法,但都未能实现。
例如,我尝试使用简单的 SQL 命令(executeStoryQuery 或其他东西)首先创建公共表表达式,但在尝试创建分页时遇到了麻烦(我使用的是 DB2)。

这就是我现在的位置:

以下内容实际上不起作用。在实际从数据库中提取数据之前尝试在 secondarySelect 上使用 Contains 时出现错误

//ctx => my Entities context
//userInput1 => int, userInput2 => int
//DB table: PRIMARY_KEY_COLUMN (INTEGER),  
            GROUP_ID_COLUMN (CHAR(16) FOR BIT DATA),  
            COLUMN1 (INTEGER),  
            COLUMN2 (INTEGER)
            COLUMN3 (VARCHAR(100))

var initialSelect = ctx.MY_TABLE
                    .Where(o => o.COLUMN1 == userInput1 && initSel.COLUMN2 == userInput2);

if(!string.isNullOrWhiteSpace(userInput3))
{
    initialSelect = initialSelect.Where(o => o.COLUMN3.Contains(userInput3));
}

...
[More if()s of other columns]
...

initialSelect = initialSelect.Select(o => o.GROUP_ID_COLUMN);

var secondarySelect = from groups in ctx.MY_TABLE
                      join initialResults in initialSelect on groups.GROUP_ID_COLUMN equals initialResults.GROUP_ID_COLUMN
                      select groups.PRIMARY_KEY_COLUMN;

var finalSelect = from fullList in ctx.MY_TABLE
                  where secondarySelect.Contains(fullList.PRIMARY_KEY_COLUMN)
                  select fullList;

尝试在我尚未实际从数据库中提取的结果集上使用 Contains 时失败。
真的,我很想用一个请求来做这件事,而不是连续两次运行到数据库。

现在,一些事实:
表中的记录可以按GROUP_ID_COLUMN列分组。
具有相同GROUP_ID_COLUMN 的多条记录可以匹配相同的userInput。这意味着secondarySelect 中的结果不是不同的(重复了几条记录)。

尝试在 2 个语句而不是 3 个语句中执行此操作也会产生问题。
我的尝试看起来像这样:

var initialSelect = ctx.MY_TABLE
                    .Where(o => o.COLUMN1 == userInput1 && initSel.COLUMN2 == userInput2);

if(!string.isNullOrWhiteSpace(userInput3))
{
    initialSelect = initialSelect.Where(o => o.COLUMN3.Contains(userInput3));
}

...
[More if()s of other columns]
...

initialSelect = initialSelect.Select(o => o.GROUP_ID_COLUMN);

var secondarySelect = from groups in ctx.MY_TABLE
                      join initialResults in initialSelect on groups.GROUP_ID_COLUMN equals initialResults.GROUP_ID_COLUMN
                      join finalResults in ctx.MY_TABLE on groups.PRIMARY_KEY_COLUMN equals finalResults.PRIMARY_KEY_COLUMN
                      select groups.PRIMARY_KEY_COLUMN;

因为,正如我所提到的,initialSelect 可能会返回多个具有相同 GROUP_ID_COLUMN 的记录,这意味着对于 GROUP_ID_COLUMN 的每次重复,我都会获得属于该组的 所有 记录。这可以少至 2 个(甚至 1 个),多至 几百个... 添加 [from...select...].Distinct() 只会导致它崩溃并抛出一些关于对 DB 的请求被中断的无意义的异常。

【问题讨论】:

    标签: c# join linq-to-entities


    【解决方案1】:

    所以我想通了。

    我就这样解决了。注意两个Distinct() 调用。我假设只有第二个是必需的,但我认为拥有第一个应该可以减少以后需要进行的迭代次数。

    //ctx => my Entities context
    //userInput1 => int, userInput2 => int
    //DB table: PRIMARY_KEY_COLUMN (INTEGER),  
                GROUP_ID_COLUMN (CHAR(16) FOR BIT DATA),  
                COLUMN1 (INTEGER),  
                COLUMN2 (INTEGER)
                COLUMN3 (VARCHAR(100))
    
    var initialSelect = ctx.MY_TABLE
                        .Where(o => o.COLUMN1 == userInput1 && initSel.COLUMN2 == userInput2);
    
    if(!string.isNullOrWhiteSpace(userInput3))
    {
        initialSelect = initialSelect.Where(o => o.COLUMN3.Contains(userInput3));
    }
    
    ...
    [More if()s of other columns]
    ...
    
    initialSelect = initialSelect.Select(o => o.GROUP_ID_COLUMN).Distinct();
    
    
    var secondarySelect = from finalResults in ctx.MY_TABLE
                          join (from groups in ctx.MY_TABLE
                                join initialResults in initialSelect on groups.GROUP_ID_COLUMN equals initialResults.GROUP_ID_COLUMN
                                select groups.PRIMARY_KEY_COLUMN).Distinct() on finalResults.PRIMARY_KEY_COLUMN equals groups.PRIMARY_KEY_COLUMN
                          select groups.PRIMARY_KEY_COLUMN;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多