1

利用 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挂起并且具有与可枚举角色中的 KeyValuePair 匹配的挂起 WorkflowRequestInformationAction 的对象。

我不喜欢使用 lambda 表达式,因为这个表达式已经变得笨拙,如果有更优雅的 ICriteria 表达式,我会全力以赴。我有哪些选项可以根据我的值限制我的结果roles List<KeyValuePair<string, string>>但防止“不支持指定的方法”异常?

4

2 回答 2

1

NHibernate 中的 LINQ 提供程序不完全受支持,您正在尝试在未从提供程序解析的表达式树的一部分上执行扩展方法。

这篇文章可能会帮助您解决问题。请务必查看相关帖子。

另请参阅 Fabio Maulo 关于NHibernate LINQ 提供程序扩展的帖子。

于 2012-06-07T19:48:37.477 回答
1

我认为这会得到相同的结果......

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 更满意。

于 2012-06-07T20:28:29.610 回答