Hallo,
vorab schonmal sorry für die schlechte Namensgebung des Themas. Da ich nicht wirklich weiß was mir fehlt bzw was ich falsch mache kann ich leider auch keinen präziseren Namen vergeben.
Ich hab vor ca 2 Tagen begonnen mich mit der ASP.NET Web API und der Web MVC auseinander zu setzen, da ich die Web API in den nächsten 1-2 Wochen in meinem Job benötigen werde.
Zu Testzwecken hab ich mir mal 3 Models angelegt: Category, Thread, Post.
Ich hab´s bereits geschafft diese Models erfolgreich per GET, POST, PUT, DELETE abzufragen bzw zu beeinflussen. Ich hab´s auch geschafft das wenn ich einen Thread abrufe automatisch das Category Model im Thread enthalten ist. Nun möchte ich aber die Category Models abrufen und da am besten auch gleich die darin enthaltenen Threads mitsenden. Aber egal was ich versuche, es kommt beim Aufrufen der API immer eine Fehlermeldung zurück die besagt das der jeweils von mir gewählte Typ nicht in ein XML/JSON Format übertragen werden kann (zumindest verstehe ich die Fehlermeldung so..).
In meinem ThreadsController (also da wo noch alles funktioniert) sieht es wie folgt aus:
// GET /api/Threads
[ResponseType(typeof(ViewModels.ThreadViewModel))]
[EnableCors(origins:"*", headers:"*", methods:"*")]
public async Task<IHttpActionResult> Get()
{
using (var db = new MainContext())
{
return Ok(await db.Threads.Include(t=>t.Category).Select(
t => new ViewModels.ThreadViewModel { Number = t.ID, Title = t.Name }).ToListAsync()).
Cached(cacheability: Cacheability.Public, maxAge: TimeSpan.FromSeconds(30));
}
}
Alles anzeigen
Hier verstehe ich noch nicht so ganz wie das System automatisch das richtige Category Model findet da ich ja "nur" .Include(t=>t.Category) schreibe und zusätzlich die CategoryId als int im Model definiere. Aber das ist noch soweit ok, ich hab mich damit abgefunden das das in dem Fall selbstständig passiert (wie auch immer).
In meinem CategoriesController hab ich einiges ausprobiert, was aber immer zur gleichen Fehlermeldung führt:
// GET api/categories
public async Task<IHttpActionResult> Get()
{
using (var db = new MainContext())
{
var result = await db.Categories.Select(t => new {
Id=t.ID,
Name=t.Name,
orderId=t.orderId
//Threads=ThreadsController.ListThreadsInCategory(t.ID),
//Threads=ListThreadsInside(t.ID),
//trs=db.Threads.Where(m => m.CategoryId == t.ID)
//Threads=new ThreadsController().ListCategoriesThreads(t.ID)
}).ToListAsync();
return Ok(result);
}
}
private IQueryable<Thread> ListThreadsInside(int id)
{
using (var db = new MainContext())
{
var result = db.Threads.Where(t => t.CategoryId == id);
return result;
}
}
Alles anzeigen
Hier hab ich mal ein paar von meinen versuchen einfach in den Kommentaren stehen lassen. Ich hätte auch versucht direkt im Model "Category" verschiedene Typen (List, IEnumerable, ..) zu definieren die eine solche Auflistung enthalten könnten aber auch da kam im Endeffekt der gleiche Fehler.
Es wird immer ca diese Fehlermeldung ausgegeben:
ZitatLINQ to Entities does not recognize the method 'System.Linq.IQueryable`1[TestAPI2.Models.Thread] ListThreadsInside(Int32)' method, and this method cannot be translated into a store expression.
Ich hoffe die betroffenen Fachpersonen wissen welchen Fehler ich mache und können mir vielleicht weiterhelfen