我正在测试使用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,但它产生了同样的错误。
答案 0 :(得分:2)
旧的(2.x)Linq提供程序不支持String.Length投影。
NHibernate 3.x中新的Linq提供程序已集成;你不必下载任何额外的东西。
新的扩展方法是session.Query
而不是session.Linq
;如果你使用后者,你仍然在使用旧的提供者。