2012-06-07 2 views
1

Использование NHibernate Я пытаюсь использовать лямбда-выражение для извлечения объектов на основе состояния и значений между родительским дочерним отношением. AbstractWorkflowRequestInformation имеет коллекцию WorkflowRequestInformationAction. Каждый из двух классов имеет свои свойства статуса. Для того, чтобы проиллюстрировать здесь сокращенные классы, как они относятся к этому запросу:Исключение «Указанный метод не поддерживается». будучи выброшенным из выражения NHibernate IQueryable при использовании. Любое расширение

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; } 
} 

Учитывая эти отношения, я хочу, чтобы получить объекты AbstractWorkflowRequestInformation основан на List<KeyValuePair<string, string>> называемых ролей. Я понимаю, что исключение вызвано отсутствием разбора метода расширения 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 соответствия с KeyValuePair в роли перечислимых.

Я не привязан к использованию выражения лямбда, поскольку это выражение уже стало громоздким, если есть более элегантное выражение ICriteria, я все уши. Каковы мои возможности ограничить мои результаты на основе значений в моем roles List<KeyValuePair<string, string>>, но исключить исключение «Указанный метод не поддерживается»?

+0

короткий ответ ... не использовать NH Linq – dotjoe

+0

@ dotjoe Я поддаюсь этому ответу, но есть ли у вас альтернатива с использованием HQL, ICriteria и т. Д.? – ahsteele

ответ

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.

+0

Это сделало трюк. После дополнительного чтения я определенно прихожу к выводу, что реализация Linq NHibernate еще не готова к прайм-тайму. Как кто-то сказал где-то, он должен был прийти с гигантским бета-отказом от ответственности. Спасибо за элегантное решение, использующее QuveryOver/Criteria! – ahsteele

+0

приятно слышать. Я думаю, что разработчики NH отказались от провайдера Linq. Они могут обеспечить намного более сладкие функции с QueryOver. – dotjoe

+0

это обязательно похоже так же. Несчастное положение вещей, потому что Линк чувствует себя более «естественным». Тем не менее я предпочитаю использовать вещи, которые работают против того, что кажется естественным. ;) – ahsteele

1

Поставщик LINQ в NHibernate не поддерживается полностью, вы пытаетесь выполнить метод расширения на части дерева выражений, которая не анализируется поставщиком.

Этот post поможет решить возникшую проблему. Обязательно проверьте соответствующие сообщения.

Также смотрите сообщение от Fabio Maulo по телефону NHibernate LINQ provider extension.

Смежные вопросы