0

我正在使用 NHibernate,我得到以下代码:

public class User
{
  public User()
  {
    public virtual int Id { get; set; }
    public virtual IList<UserConfirmation> UserConfirmation { get; set; }
    public virtual string Email;
  }

  public User()
  {
    UserConfirmation = new List<UserConfirmation>();
    }
}

public class UserConfirmation
{
  public virtual int Id { get; set; }
  public virtual User { get; set; }
}

public class UserMap :      ClassMap<User>
{
  public UserMap()        
  {
  Id(x => x.Id);            
  Map(x => x.Email);           
  HasMany(x => x.UserConfirmation)
    .Inverse()
    .Cascade.All();
  Table("user");
}

}

public class UserConfirmationMap : ClassMap<UserConfirmation>
{
    public UserConfirmationMap()
      {
        Id(x => x.Id);            
        References(x => x.User);
        Table("user_confirmation");
    }
}

但是当我尝试这样查询时:

QueryOver<UserConfirmation>().Where(x => x.User.Email).Take(1).SingleOrDefault()

比它说我没有属性User.Email。

我怎么解决这个问题?

4

4 回答 4

2

问题是您正在使用 x => x.User.Email 这应该使用另一个别名来完成,这将是用户

UserConfirmation userConfirmationAlias;
User userAlias;


    QueryOver<UserConfirmation>(() => userConfirmationAlias)
    .joinAlias(() => userConfirmationAlias.User , () => userAlias)
    .Where(() => userAlias.Email).Take(1).SingleOrDefault()

像上面这样的东西应该可以解决问题

于 2012-04-04T04:53:50.577 回答
1

我想你想要这样的东西。

QueryOver<User>().Where(x => x.Email).Take(1).SingleOrDefault()

x 应该已经是用户了。如果不是,我会使用智能感知来查看它认为它是什么类型。

于 2012-04-04T01:38:36.267 回答
1

尝试做:

IQueryOver<UserConfirmation,User> qo = _Session.QueryOver<UserConfirmation,User>().Where(x => x.User.Email).Take(1).SingleOrDefault();
于 2012-04-04T04:53:43.570 回答
1

您可以使用 LINQ 而不是 QueryOver:

Query<UserConfirmation>().Where(x => x.User.Email).Take(1).SingleOrDefault()

顺便说一句,.Take(1).SingleOrDefault()可能不需要。如果Email是唯一的,.SingleOrDefault()就足够了。否则,您可以使用.FirstOrDefault()

于 2012-04-04T13:14:54.927 回答