C#Linq to Entities - 同一个表上的多个连接

时间:2013-11-25 13:57:26

标签: c# join linq-to-entities

我需要根据以下内容从DB表中获取行组:

  1. 按用户输入过滤
  2. 与过滤结果相对应的组
  3. 我已经尝试了几个解决方案的想法,但是所有这些想法都不尽如人意 例如,我尝试使用简单的SQL命令(executeStoryQuery或其他东西),我首先创建一个公用表表达式,但是当我尝试创建分页时遇到麻烦(我正在使用DB2)。

    这就是我现在所处的位置:

    以下内容实际上无效。在实际从数据库中提取数据之前尝试在secondarySelect上使用包含时出现错误

    //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时失败。
    真的,我非常希望用一个请求来做这个,而不是连续两次运行到DB。

    现在,有些事实:
    表格中的记录可以按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的无意义异常。

1 个答案:

答案 0 :(得分:0)

所以我想通了。

我解决了这个问题。请注意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;