NHibernate条件查询-如何在一对一关系中使用



我有3个简单的POCO类:

public class User
{
    //PK
    public virtual int UserId { get; set; }
    //ONE to ONE
    public virtual Profil Profil{ get; set; }
    //ONE to MANY
    public virtual IList<PhotoAlbum> Albums { get; set; }
}
public class Profil
{
    //PK
    public virtual int ProfilId { get; set; }
    public virtual int Age { get; set; }
    public virtual int Sex { get; set; }
}
public class PhotoAlbum
{
    //PK
    public virtual int PhotoAlbumId { get; set; }
    public virtual string Name { get; set; }
    public virtual int NumberOfPhoto { get; set; }
}

我创建了这些映射类:

public class UserMap : ClassMap<User>
    {
        public UserMap()
        {
            //PK
            Id(p => p.UserId)
               .GeneratedBy.Identity();
            //FK
            References(p => p.Profil)
                .Column("ProfilId")
                .Cascade.All(); 
            //ONE TO MANY
            HasMany(p => p.Albums)
                 .Cascade.All();
            Table("Users");
        }
    }
    public class ProfilMap: ClassMap<Profil>
    {
        public ProfilMap()
        {
            Id(p => p.ProfilId)
                .GeneratedBy.Identity();
            Map(p => p.Age)
                .Not.Nullable();
            Map(p => p.Sex)
            Table("Profiles");
        }
    }
    public class PhotoAlbumMap : ClassMap<PhotoAlbum>
    {
        public PhotoAlbumMap()
        {
            Id(p => p.PhotoAlbumId)
                .GeneratedBy.Identity();
            Map(p => p.Name)
                .Not.Nullable();
            Map(p => p.NumberOfPhoto)
                .Not.Nullable();
            Table("PhotoAlbums");
        }
    }

然后我用这个方法创建了一个简单的NHibernate存储库类:

    public IList<T> GetItemsByCriterions(params ICriterion[] criterions)
    {
        ICriteria criteria = AddCriterions(_session.CreateCriteria(typeof(T)),
            criterions);
        IList<T> result = criteria.List<T>();
        return result ?? new List<T>(0);
    }
对于测试,我为一些实体创建了存储库,例如User:
_userRepo = new NHibRepository<User>(NHibeHelper.OpenSession());

和我想有可能这样查询:

    var users = _userRepo.GetItemsByCriterions(new ICriterion[]
                                                   {
                                                       Restrictions.Gt("Profile.Age",10)
                                                   });

this attempt finished with error:

无法解析属性:Profile of: Repository。用户

用户具有Profile类型的Profile属性,该属性具有ProfileId, Age属性和性。

** #1编辑:**

@ I tried this:

    var users = _userRepo.GetItemsByCriterions(new ICriterion[]
                                                   {
                                                       Restrictions.Where<User>(u=>u.Profil.Sex==0)
                                                   });

finished with error:

无法解析属性:配置文件。性别:仓库。用户

#2 EDITED

我试着用Nathan的建议:

        var result = _userRepo.Session.CreateCriteria<User>()
            .CreateAlias("Profile", "profile", JoinType.InnerJoin)
            .Add(Restrictions.Eq("profile.Sex", 0));
        IList<User> users=null;
        if (result != null)
            users = result.List<User>();

如果我尝试将结果转换为列表,我再次得到此错误:无法解析属性:配置文件:存储库。用户

查看您的示例,User有一个Profile属性而不是Profile属性。

如果它应该是profile,那么我会将Restrictions.Gt(Profile.Age,10)更改为Restrictions.Gt(Profil.Age,10),否则更改属性和映射的名称以匹配查询。

编辑:
您正在尝试查询用户对象。你需要包含CreateAlias让nhibernate知道你想链接到一个不同的对象。

试试这个。

var users = session.CreateCriteria<User>() 
  .CreateAlias("Profile", "profile", JoinType.InnerJoin) 
  .Add(Restrictions.Eq("profile.Age", 10)); 

最新更新