我需要根据以下内容从DB表中获取行组:
我已经尝试了几个解决方案的想法,但是所有这些想法都不尽如人意
例如,我尝试使用简单的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的无意义异常。
答案 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;