2012-03-03 77 views
0

使用Criteria API,NHibernate中LINQ to SQL查询的正确转换是什么?将LINQ to SQL查询转换为NHibernate(子集合筛选器)

var result = from e in Employees 
    where e.WorkTimeEntries.Any(t => t.DateTime >= new DateTime(2012, 3, 1)) 
    select e; 

我曾尝试:

var employees  = Session.QueryOver<Employee>(); 
var timeWorkedAlias = new HashedSet<WorkTimeEntry>(); 
var timeWorked  = employees.Left.JoinQueryOver(e => e.WorkTimes, 
                 () => timeWorkedAlias); 
timeWorkedAlias.Where (wa => wa.DateTime >= new DateTime(2012,3,1)); 
// How do to include the timeWorkedAlias 'filter' in the query? 

var result = employees.List(); 

我缺少几个步骤,包括日期过滤器将包含在查询中。

+1

与标准的工作是可怕的,为什么不使用linq2nhibernate? – 2012-03-03 09:36:33

+0

@SaeedAmiri,我希望我可以,但是Linq2NHibernate有它自己的限制,我不得不使用标准api :( – 2012-03-03 09:41:34

+0

@Saeed Amiri NHibrnate LINQ提供程序是一个笑话,如果我到达,我将永远不会再使用NHibernate – Stilgar 2012-03-03 09:46:10

回答

1

我想我设法找到了答案(由安德烈帮助)

这似乎工作:

var result = Session.QueryOver<Employee>() 
.JoinQueryOver<WorkTimeEntry>(e => e.WorkTimes) 
.Where(t => t.DateTime > new DateTime(2012,3,1)) 
.List(); 

关键是要指定JoinQueryOver<WorkTimeEntry>

根据QueryOver in NH 3.0

请注意,JoinQueryOver的重载需要IEnumerable,而 C#编译器从中推断出类型。如果您收藏类型不是 的IEnumerable,然后需要判定的子标准类型:

+0

好的,我不知道WorkTimes不是IEnumerable。在我的例子中,我也有一个小错字。无论如何,如果我能帮上忙的话。 – 2012-03-03 10:04:57

3

我现在不能测试,但这个应该工作:

var result = Session.QueryOver<Employee>() 
    .JoinQueryOver(x => x.WorkTimes) 
    .Where(wt=> wt.DateTime >= new DateTime(2012, 3, 1)) 
    .List(); 

应该过滤器根据孩子收集的财产(父实体(员工),因为它是一个内部联接)。但是,我还没有测试过它。

+0

谢谢你的回答,但不幸的是它无法编译。错误消息:'委托'System.Func '不带1个参数不能将lambda表达式转换为类型'NHibernate.Criterion.ICriterion',因为它不是委托类型'。 – 2012-03-03 09:55:14

+0

我在你的帮助下找到了答案。看起来我必须限定'JoinQueryOvery',因为WorkTime没有实现IEnumerable(你不知道这个有限的例子)。 – 2012-03-03 10:05:51