首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SelectList in QueryOver

SelectList in QueryOver
EN

Stack Overflow用户
提问于 2017-10-27 18:25:04
回答 1查看 374关注 0票数 2

我对QueryOver的选择有一些问题,下面是我的模型类:

代码语言:javascript
复制
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; }
}

以下是我的疑问:

代码语言:javascript
复制
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>();

我得到了一个错误:

对象引用未设置为对象的实例。

我确信这一行代码的问题是:

代码语言:javascript
复制
 .Select(()=> user.Login).WithAlias(() => result.CreateUser)

如果我将这一行注释掉,查询工作正常,并且返回结果时不会出错。

为了消除映射错误,我尝试了以下方法:

代码语言:javascript
复制
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>();

这也很好。

在我的Expenditure表中,列CreateUser_Id everywhere有一个值

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-27 19:28:04

尝试将用作别名的对象用作null:

代码语言:javascript
复制
User user = null; 
ExpenseDetailsItemVm result = null;

因为它们只用于创建具有强类型语法的SQL。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46981309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档