我的应用程序具有以下实体:
public class User
{
public virtual int UserID { get; set; }
public virtual Membership LatestMembership { get { return Membership.First(); } }
public virtual IList<Membership> Membership { get; set; }
public User()
{
Membership = new List<Membership>();
}
}
使用以下映射:
public UserMap()
{
Table("Users");
Id(x => x.UserID);
HasMany(x => x.Membership)
.KeyColumn("UserID")
.OrderBy("DateAdded DESC")
.Inverse()
.Cascade.All();
}
针对用户的LatestMembership属性只是从Membership集合中获取第一条记录(已订购,以便较新的记录位于顶部)。
到目前为止一直很好,但是现在说我想做以下事情(我知道这会将它们全部归还,但我只是以此为例):
var users = session.Linq<User>()
.Where(u => u.LatestMembership.DateAdded < DateTime.UtcNow);
抛出错误,因为LatestMembership属性超出了nhibernate linq提供程序的功能。到目前为止,我唯一的解决方案是将其转换为列表,然后应用where条件,但我想这对于大型数据库来说可能变得非常不足。
我想知道是否有其他方式可以映射这个或你的建议是什么。感谢
答案 0 :(得分:1)
不幸的是,使用当前的Linq提供程序实际上并不可能。您可以做的一件事是将要查询的LatestMembership的属性映射为只读,并在映射中使用公式来获取它的值。您可以在我对this post的回答中看到更多详细信息。
另一种可能的解决方案是从Membership
方面对此进行攻击;查询与相关用户匹配的最新成员资格并相应地过滤。