使用 时从 NHibernate IQueryable 表达式中抛出异常“不支持指定方法”.任何扩展名
本文关键字:方法 扩展名 任何 不支持 NHibernate 时从 IQueryable 表达式 抛出异常 使用 | 更新日期: 2023-09-27 18:36:27
利用NHibernate,我正在尝试使用lambda表达式根据父子关系之间的状态和值检索对象。 AbstractWorkflowRequestInformation
有一个WorkflowRequestInformationAction
集合。这两个类中的每一个都有自己的状态属性。为了说明,以下是与此查询相关的缩写类:
public class AbstractWorkflowRequestInformation
{
public virtual RequestStatus RequestStatus { get; set; }
public virtual IEnumerable<WorkflowRequestInformationAction>
WorkflowRequestInformationActionList { get; set; }
}
public class WorkflowRequestInformationAction
{
public virtual ActionStatus Status { get; set; }
public virtual string RoleIdentifier { get; set; }
public virtual string RoleName { get; set; }
}
鉴于这种关系,我想根据称为角色List<KeyValuePair<string, string>>
检索 AbstractWorkflowRequestInformation 对象。我意识到异常是由于缺乏对Any(...)
扩展方法的解析引起的,但我不确定替代查询。到目前为止,以下查询的所有排列都导致了相同或类似的异常:
public IEnumerable<IRequestInformation> GetRequestsPendingActionBy(
List<KeyValuePair<string, string>> roles)
{
var results = GetSession().Query<AbstractWorkflowRequestInformation>()
.Where(r => r.RequestStatus == RequestStatus.Pending
&& r.WorkflowRequestInformationActionList
.Any(a => ActionStatus.Pending == a.Status
&& roles.Any(kp => kp.Key == a.RoleName
&& kp.Value == a.RoleIdentifier)))
.ToList();
return results;
}
最终目标是仅检索那些挂起的AbstractWorkflowRequestInformation
对象,并且具有与可枚举角色中的键值对匹配的挂起的 WorkflowRequestInformationAction。
我不执着于使用 lambda 表达式,因为这个表达式已经变得笨拙了,如果有更优雅的 ICriteria 表达式,我全听。我有哪些选项可以根据roles List<KeyValuePair<string, string>>
中的值限制结果,但防止"不支持指定方法"异常?
我认为这会得到相同的结果...
WorkflowRequestInformationAction actionAlias = null;
var q = GetSession().QueryOver<AbstractWorkflowRequestInformation>()
.Inner.JoinAlias(x => x.WorkflowRequestInformationActionList,
() => actionAlias)
.Where(x => x.RequestStatus == RequestStatus.Pending)
.And(() => actionAlias.Status == ActionStatus.Pending);
var d = Restrictions.Disjunction();
foreach(var kvp in roles)
{
d.Add(Restrictions.Where(() => actionAlias.RoleName == kvp.Key
&& actionAlias.RoleIdentitifier == kvp.Value));
}
q.And(d).TransformUsing(Transformers.DistinctRootEntity);
var results = q.List();
您可能会对NH Linq采取类似的方法。不过,我对QueryOver/Criteria更满意。
NHibernate 中的 LINQ 提供程序不完全受支持,您正在尝试对未从提供程序分析的表达式树的一部分执行扩展方法。
这篇文章可能会帮助你解决问题。请务必查看相关帖子。
另请参阅 Fabio Maulo 关于 NHibernate LINQ 提供程序扩展的文章。