1

NHibernateの利用私はラムダ式を使用して、親子関係間のステータスと値に基づいてオブジェクトを取得しようとしています。AbstractWorkflowRequestInformationのコレクションがありWorkflowRequestInformationActionます。2つのクラスには、それぞれ独自のStatusプロパティがあります。ここで説明するために、このクエリに関連する省略されたクラスを示します。

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を持つオブジェクトのみを取得することです。

ラムダ式を使用することに夢中になっているわけではありません。この式はすでに扱いにくくなっているため、よりエレガントなICriteria式があれば、私はすべての耳です。の値に基づいて結果を制限しroles List<KeyValuePair<string, string>>、「指定されたメソッドはサポートされていません」という例外を防ぐためのオプションは何ですか?

4

2 に答える 2

1

NHibernate の LINQ プロバイダーは完全にはサポートされていません。プロバイダーから解析されていない式ツリーの一部で拡張メソッドを実行しようとしています。

この投稿は、問題の解決に役立つ場合があります。関連記事もぜひチェックしてみてください。

NHibernate LINQ provider extensionに関する Fabio Maulo の投稿も参照してください。

于 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 に答える