我正在寻求帮助,以了解如何使用 Linq to Entities 执行我需要的请求。
我在 IBM DB2 数据库中有一个表,简化后如下所示:
PK {Integer}
, GROUP {CHAR FOR BIT DATA [16]}
, USERNAME {CHAR[15]}
, ACTION {INTEGER}
. (任何值都不能为空)
有更多的列,但这些将有助于理解这一点。我需要做的是这样的:
我收到用户输入,请求具有特定或两者的所有ACTION
记录USERNAME
。
我需要返回的是所有GROUP
包含请求ACTION
和USERNAME
(如果其中一个是空的,它被忽略并且我匹配另一个)分组的所有记录。
我已经尝试了很多东西,但我一直在使用 Linq to Entities 遇到困难。我得到像"SQL0338N An ON clause associated with a JOIN [...]"
和这样的错误There is no stored type corresponding to the EDM Type 'Edm.Binary' of primitive 'Binary'
。
我试着做一个选择我在哪里
- 找到与搜索匹配的记录,
- 仅获取组列,
- 确保我只有一个(不同的)
- 尝试使用新列表搜索同一个表。
在我尝试运行的那一刻, .ToArray()
我遇到了一个异常,无论是 DB2 异常还是 Linq 异常(取决于我对代码所做的更改)。
我非常感谢任何帮助找出可行的方法来做到这一点。
** 编辑 **
@Alex好吧......问题是我尝试了几种不同的方法来处理代码,它们都导致了相同的两个错误之一(见上文)。我得出的结论是,我所做的尝试不仅在语法上存在缺陷,而且需要改变我解决问题的方向。
@ZacharyKniebel 这就是解决方案!谢谢!唯一的事情是-您给出的示例只会返回具有两个字段都匹配的记录的组。为了使它成为一个,另一个或两者,我使用了这个:
...
var records = db.Records
.GroupBy(r => r.Group);
if(requestedAction != null)
{
records = records.Where(g => g.Any(r => r.Action == requestedAction));
}
if(!string.isNullOrWhiteSpace(requestedUsername))
{
records = records.Where(g => g.Any(r => r.Username.ToLower().Contains(requestedUsername.ToLower()));
}
...