我有以下代码抛出“不支持指定方法”错误:
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
的列表list<IsAuthorized>
。{/ 1}}。
答案 0 :(得分:2)
我想说,我们可以用这种类型的查询做的最好的事情是将它移动到数据库服务器。当然,只有在可能的情况下,第一个查询才会返回外部源的结果。 然后我们必须使用一些不同的技术..但我们假设两个表都在数据库中。
第二个查询,将是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......