gpt4 book ai didi

c# - NHibernate LINQ Where 和 Any 抛出异常

转载 作者:太空宇宙 更新时间:2023-11-03 10:55:02 24 4
gpt4 key购买 nike

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

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是什么在 throw 。

我需要选择 Principal 的列表其 ID 在 list<IsAuthorized> 中.

最佳答案

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

第二个查询是 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......

关于c# - NHibernate LINQ Where 和 Any 抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19848421/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com