2017-10-27 2 views
2

Ich habe ein Problem mit durch QueryOver Auswahl, hier sind meine Modellklassen:Select in QueryOver

public class BaseModel 
{ 
    public virtual int Id { get; set; } 
    public virtual DateTime ModifyDate { get; set; } 
    public virtual DateTime CreateDate { get; set; } 
    public virtual User CreateUser { get; set; } 
    public virtual User ModifyUser { get; set; } 
    public virtual bool IsActive { get; set; } 
} 

public class BaseClassMap<T> : ClassMap<T> where T : BaseModel 
{ 
    public BaseClassMap() 
    { 
     Id(x => x.Id).GeneratedBy.Identity(); 
     References(x => x.CreateUser, "CreateUser_Id"); 
     References(x => x.ModifyUser, "ModifyUser_Id"); 
     Map(x => x.CreateDate).Not.Nullable().Default("GETDATE()"); 
     Map(x => x.ModifyDate).Not.Nullable().Default("GETDATE()"); ; 
     Map(x => x.IsActive).Not.Nullable().Default("1"); 
    } 
} 

public class Expenditure : BaseModel 
{ 
    public virtual decimal Amount { get; set; } 
    public virtual Category Category { get; set; } 
    public virtual string Comment { get; set; } 
    public virtual DateTime Month { get; set; } 
} 

public class ExpenditureMap : BaseClassMap<Expenditure> 
{ 
    public ExpenditureMap() 
    { 
     Schema("[budget]"); 
     Table("[Expenditure]"); 
     Id(x => x.Id); 
     Map(x => x.Amount).Not.Nullable(); 
     Map(x => x.Comment); 
     Map(x => x.Month).Not.Nullable(); 
     References(x => x.Category, "Category_Id").Not.Nullable(); 
    } 
} 

public class User : BaseModel 
{ 
    public virtual string Login { get; set; } 
    public virtual string Email { get; set; } 
    public virtual string Password { get; set; } 
    public virtual string PasswordSalt { get; set; } 
    public virtual string HashAlgorithm { get; set; } 
} 

public class UserMap : BaseClassMap<User> 
{ 
    public UserMap() 
    { 
     Schema("[permission]"); 
     Table("[User]"); 
     Id(x => x.Id); 
     Map(x => x.Login).Not.Nullable(); 
     Map(x => x.Email).Not.Nullable(); 
     Map(x => x.Password).Not.Nullable(); 
     Map(x => x.PasswordSalt); 
     Map(x => x.HashAlgorithm).Not.Nullable(); 
    } 
} 

public class ExpenseDetailsItemVm 
{ 
    public int Id { get; set; } 
    public string Comment { get; set; } 
    public decimal Amount { get; set; } 
    public DateTime CreateDate { get; set; } 
    public string CreateUser { get; set; } 
} 

Und hier ist meine Frage:

var user = new User(); 
var result = new ExpenseDetailsItemVm(); 
var expenses = SessionManager.Session.QueryOver<Expenditure>() 
          .JoinAlias(x => x.CreateUser,() => user) 
          .Where(x => x.IsActive && 
             x.Category.Id == categoryId && 
             x.Month == date.ToFirstDayOfMonth()) 
          .SelectList(list => list 
               .Select(x => x.Id).WithAlias(() => result.Id) 
               .Select(x => x.Amount).WithAlias(() => result.Amount) 
               .Select(x => x.Comment).WithAlias(() => result.Comment) 
               .Select(x => x.CreateDate).WithAlias(() => result.CreateDate) 
               .Select(()=> user.Login).WithAlias(() => result.CreateUser) 
      ).TransformUsing(Transformers.AliasToBean<ExpenseDetailsItemVm>()) 
      .List<ExpenseDetailsItemVm>(); 

ich diesen Fehler:

Object reference not set to an instance of an object.

ich bin sicher, dass das Problem auf dieser Codezeile:

.Select(()=> user.Login).WithAlias(() => result.CreateUser) 

Wenn ich diese Zeile kommentieren, funktioniert die Abfrage einwandfrei und gibt das Ergebnis ohne Fehler zurück.

Mapping Fehler zu beseitigen, habe ich versucht, dies:

var u = SessionManager.Session.QueryOver<User>().Where(x => x.Id == 1). 
      SelectList(list => list. 
       Select(x => x.Login).WithAlias(() => result.CreateUser)) 
      .TransformUsing(Transformers.AliasToBean<ExpenseDetailsItemVm>()) 
      .List<ExpenseDetailsItemVm>(); 

Und das funktioniert auch gut.

In meiner Expenditure Tabelle wird die Spalte CreateUser_Id überall einen Wert

+1

Versuchen Sie, die als Alias ​​verwendeten Objekte als null zu verwenden: 'User user = null;' 'ExpenseDetailsItemVm result = null;' weil sie nur zum Erstellen der SQL mit stark typisierter Syntax verwendet werden. – Najera

Antwort

2

Versuchen Sie, die Objekte als Alias ​​als null verwendet zu verwenden:

User user = null; 
ExpenseDetailsItemVm result = null; 

Weil sie nur dann verwendet werden, um die SQL mit starken typisierten zu erstellen Syntax.

Verwandte Themen