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

やってみてください:

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

QueryOver の代わりに LINQ を使用できます。

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

ところで、.Take(1).SingleOrDefault()おそらく必要ありません。Emailユニークであれば.SingleOrDefault()十分です。それ以外の場合は、使用できます.FirstOrDefault()

于 2012-04-04T13:14:54.927 に答える
1

このようなものが欲しいと思います。

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

x は既にユーザーである必要があります。そうでない場合は、インテリセンスを使用して、それがどのタイプであるかを確認します。

于 2012-04-04T01:38:36.267 に答える