0

我正在寻求帮助,以了解如何使用 Linq to Entities 执行我需要的请求。

我在 IBM DB2 数据库中有一个表,简化后如下所示: PK {Integer}, GROUP {CHAR FOR BIT DATA [16]}, USERNAME {CHAR[15]}, ACTION {INTEGER}. (任何值都不能为空)

有更多的列,但这些将有助于理解这一点。我需要做的是这样的:

我收到用户输入,请求具有特定或两者的所有ACTION记录USERNAME

我需要返回的是所有GROUP包含请求ACTIONUSERNAME(如果其中一个是空的,它被忽略并且我匹配另一个)分组的所有记录。

我已经尝试了很多东西,但我一直在使用 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'

我试着做一个选择我在哪里

  1. 找到与搜索匹配的记录,
  2. 仅获取组列,
  3. 确保我只有一个(不同的)
  4. 尝试使用新列表搜索同一个表。

在我尝试运行的那一刻, .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()));
}
...
4

1 回答 1

0

试试这个:

...
var records = db.Records
        .GroupBy(r => r.Group)
        .Where(g => g.Any(r => r.Action == requestedAction && 
                               r.Username == requestedUsername)));
...

以下是对上述内容的细分:

  1. 数据库中的“记录”表中获取行(“隐式”用作选择语句)
  2. 按“记录”表的“组”列中的值对记录进行分组
  3. 仅返回那些请求的用户名和操作与组内的一个或多个记录匹配的组

请注意,Linq 会在实际运行查询之前将 Linq 查询解析为 SQL。因此,上述全部内容将在单个查询中完成。

于 2013-11-06T17:26:16.683 回答