2

我有以下代码引发“不支持指定的方法”错误:

var list = securityRepository.Query<IsAuthorized>().Where(
    ia => ia.SecurableObjectName == objectName
    && ia.PermittedActionName == permittedActionName
    && ia.ScopeName == scopeName).ToList();

var prins = repository.Query<Principal>().Where(
    p => list.Any(l => l.PrincipalId == p.Id)).ToList();

第二个查询Any是抛出什么。

我需要选择一个列表,Principal其中的 id 位于list<IsAuthorized>.

4

1 回答 1

3

我想说,我们可以用这种类型的查询做的最好的事情就是将它移动到数据库服务器。当然,只有在可能的情况下,第一个查询没有从外部源返回结果。然后我们必须使用一些不同的技术。但让我们假设,这两个表都在数据库中。

第二个查询是 OUTER Select,第一个查询是 INNER Select。为了组合它们,我们将使用IN语句。

我们要做的是:

首先,让我们调整第一个查询,返回 One 属性/列,以供稍后使用:

var list = securityRepository
    .Query<IsAuthorized>()
    .Where(
      ia => ia.SecurableObjectName == objectName
      && ia.PermittedActionName == permittedActionName
      && ia.ScopeName == scopeName)
    // .ToList();
    .Select(ia => ia.PrincipalId);

所以,我们所做的是推迟查询执行(没有 ToList() 调用)。相反,我们创建了一个带有仅包含一个属性/列的投影的 SELECT 子句。

让我们为第二个查询调整我们拥有和需要的内容:

var prins = repository
    .Query<Principal>()
    //.Where(p => list.Any(l => l.PrincipalId == p.Id))
    .Where(p => list.Contains(p.Id)) // our subQuery
    .ToList();

这将产生如下内容:

SELECT ... 
 FROM Pincipal p
 WHERE p.Id IN (SELECT ia.PrincipalId FROM IsAuthorized ia......
于 2013-11-08T04:06:04.813 回答