Mic*_*uen 2 .net c# nhibernate linq-to-nhibernate
我正在努力实现:
select StoreId, StoreName from Store where StoreId in (
select StoreId from Employee where EmployeeName = 'Steve Jobs')
Run Code Online (Sandbox Code Playgroud)
我有这个代码:
public class Store
{
public virtual int StoreId { get; private set; }
public virtual string StoreName { get; set; }
public virtual IList<Employee> Staff { get; set; }
}
public class Employee
{
public virtual Store Store { get; set; }
public virtual int EmployeeId { get; private set; }
public virtual string EmployeeName { get; set; }
}
var q = from s in session.Query<Store>()
where
(from e in session.Query<Employee>()
where s.EmployeeName == "Steve Jobs"
select e.Store.StoreId).Contains(s.StoreId)
select s;
Run Code Online (Sandbox Code Playgroud)
NHibernate生成这个(别名被剥离):
select s.StoreId, s.StoreName
from Store s
where exists
(
select t.StoreId
from Employee e
left join Store t on t.StoreId = e.StoreId
where e.EmployeeName = 'Steve Jobs'
-- wrongly generated code
and t.EmployeeId = s.StoreId
)
Run Code Online (Sandbox Code Playgroud)
Linq-toSql正确生成代码:
select s.StoreId, s.StoreName
from Store s
where exists
(
select null
from Employee e
where e.EmployeeName = 'Steve Jobs'
and e.StoreId = s.StoreId
)
Run Code Online (Sandbox Code Playgroud)
在Linq到NHibernate上生成子查询代码是否有问题?
但是,HQL工作原理:
var q = session.CreateQuery("from Store as s where s.StoreId in (select e.WorkingInStore.StoreId from Employee as e where e.EmployeeName = 'lennon')").List<Store>();
Run Code Online (Sandbox Code Playgroud)
当然看起来像一个bug,但我认为你的整个查询过于复杂.据我了解,您希望所有名为史蒂夫乔布斯的员工都在工资单上的商店.尝试:
var q = from s in session.Query<Store>()
where s.Staff.Any(e=>e.EmployeeName == "Steve Jobs")
Run Code Online (Sandbox Code Playgroud)
这应该生成您想要的查询,并且它比子查询更清晰,更易读.
| 归档时间: |
|
| 查看次数: |
1003 次 |
| 最近记录: |