除LINQ查询之外的NHibernate映射属性

时间:2010-09-17 17:10:45

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

我的应用程序具有以下实体:

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条件,但我想这对于大型数据库来说可能变得非常不足。

我想知道是否有其他方式可以映射这个或你的建议是什么。感谢

1 个答案:

答案 0 :(得分:1)

不幸的是,使用当前的Linq提供程序实际上并不可能。您可以做的一件事是将要查询的LatestMembership的属性映射为只读,并在映射中使用公式来获取它的值。您可以在我对this post的回答中看到更多详细信息。

另一种可能的解决方案是从Membership方面对此进行攻击;查询与相关用户匹配的最新成员资格并相应地过滤。