使用nhibernate对多对多实体进行查询
本文关键字:查询 实体 使用 nhibernate | 更新日期: 2023-09-27 17:50:52
我有点需要头脑风暴…
下面是我的场景:
public class UserSystem
{
public virtual User User { get; set; }
public virtual System System { get; set; }
}
public class User
{
public User() { }
public virtual int UsrId { get; set; }
}
public class System
{
public System() { }
public virtual decimal SistId { get; set; }
public virtual IList<Perf> SystPerf { get; set; }
}
public class Perf
{
public Perf() { }
public virtual int PerfId { get; set; }
public virtual System System { get; set; }
public virtual string Perf_Adm_Portal { get; set; }
}
我需要得到所有的用户有Perf_Adm_Portal == "S"。我知道这有点简单,但我做错了什么…
我试过了:
var list = session.Query<UserSystem>()
.Fetch(x => x.User)
.Fetch(x => x.System)
.ThenFetch(x => x.SystPerf)
.Where(x => x.System.SistId == someId)
//.Where(x => x.Sistema.SystPerf.Where(x => x.Perf_Adm_Portal == "S"))
.ToList<USerSystem>();
注释行正是我想要的,但它不起作用…甚至不能编译。因此,这个查询返回给我所有用户(包括那些具有Perf_Adm_Portal 标志的用户)!= "S"),然后我只是在内存中处理它们…但是执行这个查询需要很长时间,我知道有一个更好的解决方案…你们能帮帮我吗?关于
* *编辑无所谓,男人……我刚刚意识到我有第三个表(UserPerf)。每个性能都有自己的系统。
所以我像这样检索系统的所有管理员:
var list = session.Query<UserPerf>()
.Where(up => up.Perf.Perf_Adm_Portal.ToLower().Equals("yes"))
.Where(up => up.Perf.System.SistId == sistId)
.Select(up => up.User)
.ToList<User>();
对不起,给你添麻烦了。@Radim Köhler,谢谢你的时间!但是如果没有下面的第三张表,我想我要做的事情是不可能的。
认为,
我想说,这种查询应该为您工作:
var inner = session.Query<UserSystem>()
.Where(e => e.System.SystPerf.Any(p => p.Perf_Adm_Portal == "S"))
.Select(e => e.User.UserId);
var query = session.Query<User>()
.Where(i => inner.Contains(u.userId));
var list = query
// .Skip(y).Take(x) // paging
.ToList();