Запрос NHibernate LINQ выдает ошибку «Не удалось разрешить свойство» - PullRequest
3 голосов
/ 06 мая 2010

Я тестирую с использованием LINQ с NHibernate, но столкнулся с некоторыми проблемами с разрешением string.length. У меня есть следующее

public class DC_Control
{
    public virtual int ID { get; private set; }
    public virtual string Name { get; set; }
    public virtual bool IsEnabled { get; set; }
    public virtual string Url { get; set; }
    public virtual string Category { get; set; }
    public virtual string Description { get; set; }
    public virtual bool RequireScriptManager { get; set; }
    public virtual string TriggerQueryString { get; set; }
    public virtual DateTime? DateAdded { get; set; }
    public virtual DateTime? DateUpdated { get; set; }
}

public class DC_ControlMap : ClassMap<DC_Control>
{
    public DC_ControlMap()
    {
        Id(x => x.ID);
        Map(x => x.Name).Length(128);
        Map(x => x.IsEnabled);
        Map(x => x.Url);
        Map(x => x.Category);
        Map(x => x.Description);
        Map(x => x.RequireScriptManager);
        Map(x => x.TriggerQueryString);
        Map(x => x.DateAdded);
        Map(x => x.DateUpdated);
    }
}

private static ISessionFactory CreateSessionFactory()
    {
        return Fluently.Configure()
            .Database(FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2008)
            .Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly()))
            .ExposeConfiguration(c => c.SetProperty("connection.connection_string", "CONNSTRING"))
            .ExposeConfiguration(c => c.SetProperty("proxyfactory.factory_class", "NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle"))
            .BuildSessionFactory();
    }

public static void test()
    {
        using (ISession session = sessionFactory.OpenSession())
        {
            var sqlQuery = session.CreateSQLQuery("select * from DC_Control  where  LEN(url) > 80").AddEntity(typeof(DC_Control)).List<DC_Control>();

            var linqQuery= session.Linq<DC_Control>().Where(c => c.Url.Length > 80).ToList();
        }
    }

В моем тестовом методе я сначала пытаюсь выполнить запрос с использованием SQL, это прекрасно работает. Затем я хочу сделать то же самое в LINQ, и он выдает следующую ошибку:

NHibernate.QueryException: could not resolve property: Url.Length of: DC_Control

Я много раз искал эту ошибку «не удалось разрешить свойство», но не могу понять, что это значит. Это потому, что реализация LINQ не завершена? Если это так, то немного разочаровывает Linq2Sql, где это будет работать.

Я также попытался настроить отображение с помощью hbm.xml вместо использования FluentNHibernate, но выдает ту же ошибку.

1 Ответ

2 голосов
/ 06 мая 2010

Прогнозы String.Length не поддерживаются старым (2.x) провайдером Linq.

Интегрирован новый поставщик Linq в NHibernate 3.x; Вам не нужно ничего загружать.

Новый метод расширения - session.Query вместо session.Linq; если вы используете последний, вы все еще используете старый провайдер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...