Здравствуйте, Mullih, Вы писали:
M>И в продолжение вопрос почему нельзя чтоб псевдоним полностью совпадал с путем а если можно то почему не работает в моем примере
M>т.е. сделать так
M>M>criteria = criteria.CreateAlias("Plan.TimeId", "Plan.TimeId");
M>criteria = criteria.Add(Restrictions.Gt("Plan.TimeId.StartTime", periodNumber - delta));
M>
Потому что NH не идеален.
NHibernate выборка по полям присоединённой таблицы
Всем доброго времени суток
Собственно такая проблемка.
Если делать выборку по полю текущей таблицы то все хорошо, а если по полю присоединённой то говорит что не знает такого поля(
Что необходимо добавить или изменить
На всякий приатачил проект в VS 2008 с базой
Заранее благодарен
static void Main(string[] args)
{
PlanRepository repository = new PlanRepository();
List<Plan> plan1 = repository.GetPlansListRange(new DateTime(2008, 10, 13), new DateTime(2008, 10, 14));
try
{
List<Plan> plan2 = repository.GetPlansListFuture(new DateTime(2008, 10, 14), 13, true, 5);
}
catch (Exception e)
{
Console.WriteLine(e); //could not resolve property: TimeId.StartTime of: ConsoleApplication1.Domain.Plan
}
Console.ReadKey();
}
Database MSSQL 2005
table Planning
Id int not null
Date datetime not null
TimeId int not null
table Time_table
ID_TIME_TABLE int not null
START bigint not null
FINISH bigint not null
public class PlanRepository
{
protected ICriteria Criteria(ISession session)
{
ICriteria criteria = session.CreateCriteria(typeof(Plan), "Plan");
criteria = criteria.CreateAlias("Plan.TimeId", "Plan_TimeId");
return criteria;
}
public List<Plan> GetPlansListRange(DateTime from, DateTime to)
{
using (ISession session = NHibernateHelper.OpenSession())
{
ICriteria criteria =
Criteria(session)
.Add(Restrictions.Between("Plan.Date", from, to));
var result = criteria.List<Plan>();
return new List<Plan>(result);
}
}
public List<Plan> GetPlansListFuture(DateTime from, int periodNumber, bool isCurrentPeriod, int delta)
{
using (ISession session = NHibernateHelper.OpenSession())
{
ICriteria criteria =
Criteria(session)
.Add(Restrictions.Between("Plan.Date", from, DateTime.Now.AddMonths(1).Date));
if (isCurrentPeriod)
{
if (delta > 0)
{
criteria =
criteria.Add(Restrictions.Gt("Plan.TimeId.StartTime", periodNumber - delta));
}
criteria = criteria
.Add(Restrictions.Gt("Plan.TimeId.FinishTime", periodNumber));
}
else
{
criteria = criteria
.Add(Restrictions.Gt("Plan.TimeId.StartTime", periodNumber));
}
var result = criteria.List<Plan>();
return new List<Plan>(result);
}
}
}
public class NHibernateHelper
{
private static readonly ISessionFactory _sessionFactory;
private static readonly Configuration cfg;
static NHibernateHelper()
{
try
{
cfg = new Configuration();
cfg.Configure();
cfg.AddAssembly(Assembly.GetExecutingAssembly());
_sessionFactory = cfg.BuildSessionFactory();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
public static ISessionFactory SessionFactory
{
get{return _sessionFactory;}
}
public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}
public class Plan
{
public virtual long Id{get;set;}
public virtual DateTime Date{get;set;}
public virtual Time TimeId{get;set;}
}
public class Time
{
public virtual long Id{get;set;}
public virtual long StartTime{get;set;}
public virtual long FinishTime{get;set;}
}
mapping
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="ConsoleApplication1"
namespace="ConsoleApplication1.Domain">
<class name="Time" table="Time_table" lazy="true">
<id name="Id" column="ID_TIME_TABLE">
<generator class="identity"/>
</id>
<property name="StartTime" column="START" not-null="true"/>
<property name="FinishTime" column="FINISH" not-null="true"/>
</class>
<class name="Plan" table="Planning" lazy="true">
<id name="Id" column="Id">
<generator class="identity"/>
</id>
<property name="Date" column="Date" not-null="true"/>
<many-to-one name="TimeId" class="Time" column="TimeId" not-null="true" lazy="false"/>
</class>
</hibernate-mapping>
Здравствуйте, Mullih, Вы писали:
M>Если делать выборку по полю текущей таблицы то все хорошо, а если по полю присоединённой то говорит что не знает такого поля(
M>Заранее благодарен
M>...
M> criteria = criteria.CreateAlias("Plan.TimeId", "Plan_TimeId");
...
M> criteria =
M> criteria.Add(Restrictions.Gt("Plan.TimeId.StartTime", periodNumber - delta));
...
M>
1) Нужно создать псевдоним(alias) на ассоциацию, это сделано
2) критериях вместо названии ассоциации нужно испольовать псевдоним
criteria.Add(Restrictions.Gt("Plan_TimeId.StartTime", periodNumber - delta));
Здравствуйте, achmed, Вы писали:
A>Здравствуйте, Mullih, Вы писали:
M>>Если делать выборку по полю текущей таблицы то все хорошо, а если по полю присоединённой то говорит что не знает такого поля(
M>>Заранее благодарен
M>>A>...
M>> criteria = criteria.CreateAlias("Plan.TimeId", "Plan_TimeId");
A>...
M>> criteria =
M>> criteria.Add(Restrictions.Gt("Plan.TimeId.StartTime", periodNumber - delta));
A>...
M>>
A>1) Нужно создать псевдоним(alias) на ассоциацию, это сделано
A>2) критериях вместо названии ассоциации нужно испольовать псевдоним
A>A>criteria.Add(Restrictions.Gt("Plan_TimeId.StartTime", periodNumber - delta));
A>
Спасибо, помогло
И в продолжение вопрос почему нельзя чтоб псевдоним полностью совпадал с путем а если можно то почему не работает в моем примере
т.е. сделать так
criteria = criteria.CreateAlias("Plan.TimeId", "Plan.TimeId");
criteria = criteria.Add(Restrictions.Gt("Plan.TimeId.StartTime", periodNumber - delta));