Je construis une application web avec .Net Core en utilisant web api, angular 2 et NHibernate. J'ai les tableaux ci-dessous dans ma base de données:NHibernate La requête pour les résultats de json est inattendue
Todo
ID
Name
Priority
priorité
ID
Name
Et le mappage suivant pour ces tableaux:
[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; }
}
J'ai également les éléments suivants DTO que je veux créer une liste de et l'envoyer au client Dans json: Dans le cadre de cet exemple, j'en ai enlevé d'autres propriétés.
public class TodoDTO
{
public long ID { get; set; }
public string Name { get; set; }
public Priority Priority { get; set; }
}
Quand je lance la requête ci-dessous:
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>());
le JSON résultant ne montre pas les ID
et Name
propriétés de Priority
mais il affiche les éléments suivants:
[{
"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
}
}
}]
Pourquoi il ne montre pas les propriétés ID
et Name
mais la définition de classe à la place? Lorsque je crée une liste séparée à partir de la requête ci-dessus, j'obtiens le résultat auquel je m'attendais au premier poing, mais cela semble plutôt lourd.
--------------------- EDIT ------------------------ -
Comme demandé le code qui ne me donne le résultat que je pense:
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;
}
le résultat est le retour au client avec le code suivant:
public JsonResult GetTodos()
{
var todos = GetTodos();
return new JsonResult(todos);
}
Quelle ligne génère le JSON? Pouvez-vous nous montrer l'alternative que vous avez écrite qui a fonctionné? – mjwills
Je ne pense pas que vous ayez «matérialisé» vos résultats en utilisant la méthode 'List()' sur la 'query' résultante. –
@ David Osborne: Je suis tout à fait sûr que c'est le problème, mais je ne sais pas comment y remédier exactement. – Bunnynut