【发布时间】:2013-11-25 13:57:25
【问题描述】:
我需要根据以下条件从数据库表中获取行组:
- 按用户输入过滤
- 与过滤结果相对应的组
我尝试了几个解决方案的想法,但都未能实现。
例如,我尝试使用简单的 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