ошибка nhibernate queryover.where

#c# #.net #nhibernate #lambda #compiler-errors

#c# #.net #nhibernate #лямбда #ошибки компилятора

Вопрос:

Недавно я начал играть с nhibernate и в настоящее время пытаюсь реализовать универсальную функцию, которая выполняет поиск в базе данных записей с определенным именем:

     public T FindName<T>(string name) where T : class
    {
        T obj;
        using (ISession session = m_SessionFactory.OpenSession())
        {
            obj = session.QueryOver<T>()
                .Where(x => x.Name == name).SingleOrDefault();
        }
        return obj;
    }
  

Проблема в том, что я получаю жалобу на «.Где(x => x.Name == имя)» оператор: «Делегировать»систему.Функция ‘не принимает 1 аргумент». Из того, что я видел в Интернете, это утверждение используется довольно часто, и я не уверен, что я делаю неправильно.

Пожалуйста, дайте мне знать, если у вас есть какие-либо идеи.

Большое спасибо.

Ответ №1:

Вам нужно убедиться, что вы можете вызывать Name для x типа T.

Этого можно достичь, создав интерфейс с именем свойства, типом string и указав…

где T : класс, не изменяемый

Вот некоторый код:

 interface INameable
{
   string Name { get; }
}

class MyClass
{
  ISessionFactory m_SessionFactory;

  public T FindName<T>(string name) where T : class, INameable
  {
     T obj;
     using (ISession session = m_SessionFactory.OpenSession())
     {
        obj = session.QueryOver<T>()
            .Where(x => x.Name == name).SingleOrDefault();
     }
     return obj;
  }
  

Комментарии:

1. @Morris: Я чувствую, что это случай плохого сообщения об ошибке компилятора. Это должно дать лучшее руководство в таком простом случае. Тот факт, что это универсальный вариант универсального, все же немного усложняет работу компилятора.