我正在用.net核心使用web api,angular 2和NHibernate构建一个web应用程序。 我有我的数据库中下表:NHibernate查询json结果是意想不到的
藤
ID
Name
Priority
优先
ID
Name
而且这些表下面的映射:
[Class(NameType = typeof(Todo), Table = "Todo")]
public class Todo
{
[ID(-2, Name = "ID")]
[Generator(-1, Class = "native")]
public virtual long ID { get; set; }
[Property]
public virtual string Name { get; set; }
[ManyToOne]
public virtual Priority Priority { get; set; }
}
[Class (NameType = typeof(Priority), Table = "Priority")]
public class Priority
{
[ID(-2, Name = "ID")]
[Generator(-1, Class = "native")]
public virtual long ID { get; set; }
[Property]
public virtual string Name { get; set; }
}
我也有以下DTO,我想创建一个列表并将其发送给客户端在json中: 为了这个例子的目的,我已经从它剥去了一些其他的属性。
public class TodoDTO
{
public long ID { get; set; }
public string Name { get; set; }
public Priority Priority { get; set; }
}
当我运行下面的查询:
var session = SessionFactoryConfigurationBase.GetSessionFactory().GetCurrentSession();
var query = session.QueryOver<Todo>();
TodoDTO todoSummary = null;
query.SelectList(list => list
.Select(t => t.ID).WithAlias(() => todoSummary.ID)
.Select(t => t.Name).WithAlias(() => todoSummary.Name)
.Select(t => t.Priority).WithAlias(() => todoSummary.Priority))
.TransformUsing(Transformers.AliasToBean<TodoDTO>());
生成的JSON不显示的Priority
的ID
和Name
属性,但它显示以下内容:
[{
"id":1,
"name":"TEST",
"priority":
{
"__interceptor":
{
"persistentClass":"Todo, ApplicationName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
"identifier":2,
"isUninitialized":true,
"unwrap":false,
"session":null,
"entityName": "Priority",
"isReadOnlySettingAvailable":false
}
}
}]
为什么它不显示ID
和Name
属性,但类定义呢? 当我从上面的查询创建一个单独的列表时,我得到了我期待在拳头的地方的结果,但这似乎相当麻烦。
---------------------编辑------------------------ -
按照要求,它给我的结果,我希望代码:
public IList<Todo> GetTodos()
{
var session = SessionFactoryConfigurationBase.GetSessionFactory().GetCurrentSession();
var query = session.QueryOver<Todo>()
.Fetch(t => t.Priority).Eager
.List<Todo>();
if(!query.Any())
{
return null;
}
var result = (
from t in query
select new TodoDTO
{
ID = t.ID,
Name = t.Name,
Priority = t.Priority
}
).ToList();
return result;
}
结果返回给客户端用下面的代码:
public JsonResult GetTodos()
{
var todos = GetTodos();
return new JsonResult(todos);
}
哪条线正在生成JSON?你能告诉我们你写的那个工作的替代方案吗? – mjwills
我不认为你已经通过在所得到的query上使用'List()'方法来“实现”你的结果。 –
@David Osborne:我确实很确定这是问题所在,但我不知道如何解决这个问题。 – Bunnynut