使用nhibernate查询多对多实体

时间:2015-05-26 12:06:22

标签: c# linq nhibernate fluent-nhibernate linq-to-nhibernate

我在这里需要一个头脑风暴..

这是我的情景:

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)。 每个perf都有自己的系统。

所以我检索了这样一个系统的所有管理员:

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

抱歉有问题......

@RadimKöhler,谢谢你的时间!但是,如果没有下面的第三张表,我认为我试图做到这一点是不可能的。

此致

1 个答案:

答案 0 :(得分:0)

我想说,这种查询对您有用:

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