Существуют операторы для выполнения implicit
и explicit
пользовательское преобразование типов между заявленным классом и одним или несколькими произвольными классами. implicit
оператор эффективно позволяет моделирование перегрузки assignement оператора, который возможен на языках, таких как C++, но не C#.
Это, кажется, не функция, через которую каждый приезжает очень часто, но это на самом деле используется в LINQ к библиотеке XML (System.Xml.Linq
), где можно неявно преобразовать строки в XName
объекты. Пример:
XName tagName = "x:Name";
я обнаружил эту функцию в этом статья о том, как моделировать множественное наследование в C#.
Я также следил за Summer of NHibernate Screencast Series и наткнулся на та же проблема.
Проблема заключается в HQL « выберите из пользователя p » измените это на « выберите p из пользователя p » или просто « из пользователя p ».
« Сокращенная »форма HQL, которая использовалась в скринкастах в NHibernate версии 1.2, была устаревшей в 2.0 и исключена в 2.1.x в качестве парсера запросов по умолчанию был заменен на более строгий параметр.
public IList<Person> GetPersonsByFirstName(string firstName)
{
ISession session = GetSession();
return session.CreateQuery("select p from Person p where p.FirstName=:fn")
.SetString("fn", firstName)
.List<Person>();
}
Поскольку вы указываете пространство имен в элементе
<class name="Person" table="Person">
....
После того, как вы попробуете это, если это не сработает - Понятия не имею, почему это не работает. Я пробовал в значительной степени приведенный вами пример, и он сработал.
Я видел, как новый синтаксический анализатор выдает несколько странных ошибок, и вам просто нужно использовать метод проб и ошибок, когда это происходит: (.
Edit
О методе проб и ошибок: вы можете изменить запрос на "from Person" и посмотреть, работает ли это (если нет ... я застрял). Затем добавьте фильтр, сначала попробуйте напрямую p.FirstName = 'x' . Затем попробуйте с параметром. Вы можете попробовать не добавлять псевдоним.
Также попробуйте использовать последнюю версию NH.
Edit 2
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateTests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" namespace="NHibernateTests">
<class name="User" table="`User`" xmlns="urn:nhibernate-mapping-2.2">
<id name="Id" type="Int32" column="UserId">
<generator class="assigned" />
</id>
<property name="UserName" type="String">
<column name="UserName" not-null="true" />
</property>
<property name="FName" type="String">
<column name="FName" />
</property>
</class></hibernate-mapping>
и запрос:
IList<User> users = session.CreateQuery("select from User p " +
"where p.UserName=:fn").SetString("fn", "u")
.List<User>();
Работает как шарм.