次の 2 つの簡略化されたエンティティがあります。
public class Measurement : Entity
{
public virtual float DisplayValue { get; set; }
private DateTime _timeStamp;
public virtual DateTime TimeStamp
{
get { return _timeStamp; }
set { _timeStamp = value.ToUniversalTime(); }
}
}
public class TimeStamp : Entity
{
public virtual DateTime TimeStampEntry { get; set; }
}
そして、この(my)sqlコードを使用して、範囲内の欠損値を特定しています:
SET time_zone='+0:00';
select
a.TimeStampEntry,
b.DisplayValue
from timestamps as a
left outer join
(
select
TimeStamp,
DisplayValue
from measurements
) as b on a.TimeStampEntry = b.TimeStamp
where a.TimeStampEntry>='2010-01-01 00:00:00' and a.TimeStampEntry<'2010-01-31 23:59:59' and b.DisplayValue is null
order by a.TimeStampEntry asc
Nhibernate 3.x、できればLinqでこれをどのように達成できるか疑問に思っています。
ところで、日時フィールド間の関係は流暢なnhibernateで定義されていないため、深刻なことは何も試していません。ICriteria、Linq、HQLなどを使用できるようにするためにこれを定義する必要があるかどうかはわかりません。どんなフィードバックでも大歓迎です。ありがとう。
PS:
私はこれで始めました(動作コードではありません):
var x = (from ts in NHibernateSession.Current.Query<TimeStamp>()
join m in NHibernateSession.Current.Query<Measurement>()
on ts.TimeStampEntry equals m.TimeStamp into ps
from m in ps.DefaultIfEmpty()
select new { m.TimeStamp }).ToList();
PPS:
スタックトレース:
at NHibernate.Linq.Visitors.QueryModelVisitor.VisitGroupJoinClause(GroupJoinClause groupJoinClause, QueryModel queryModel, Int32 index)
at Remotion.Linq.Clauses.GroupJoinClause.Accept(IQueryModelVisitor visitor, QueryModel queryModel, Int32 index)
at Remotion.Linq.QueryModelVisitorBase.VisitBodyClauses(ObservableCollection`1 bodyClauses, QueryModel queryModel)
at Remotion.Linq.QueryModelVisitorBase.VisitQueryModel(QueryModel queryModel)
at NHibernate.Linq.Visitors.QueryModelVisitor.Visit()
at NHibernate.Linq.Visitors.QueryModelVisitor.GenerateHqlQuery(QueryModel queryModel, VisitorParameters parameters, Boolean root)
at NHibernate.Linq.NhLinqExpression.Translate(ISessionFactoryImplementor sessionFactory)
at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(String queryIdentifier, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
at NHibernate.Engine.Query.HQLExpressionQueryPlan.CreateTranslators(String expressionStr, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory)
at NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(String expressionStr, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory)
at NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(String expressionStr, IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory)
at NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters)
at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow)
at NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression)
at NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression expression, IQuery& query, NhLinqExpression& nhQuery)
at NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression)
at NHibernate.Linq.DefaultQueryProvider.Execute[TResult](Expression expression)
at Remotion.Linq.QueryableBase`1.GetEnumerator()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)