使用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,谢谢你的时间!但是如果没有下面的第三张表,我想我要做的事情是不可能的。

认为,

使用nhibernate对多对多实体进行查询

我想说,这种查询应该为您工作:

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();