我在这里需要一个头脑风暴..
这是我的情景:
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,谢谢你的时间!但是,如果没有下面的第三张表,我认为我试图做到这一点是不可能的。
此致
答案 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();