Frage

Ich bin Codierung in diesem Forum und da ich zu LINQ bin neu ich in dieses Problem lief, wenn der Benutzer die Hauptseite trifft. Ich möchte eine Tabelle, die eine Liste von Foren wie diese Anzeige:

Forum  --- Topics (count) --- Posts (count) --- LastPostUserId --- LastPostTime

Ich habe folgende SQL-Tabellen:

Forums:
ForumId (int32),
Title (string),
Description (string)

ForumThreads:
ThreadId (int32),
ForumId (int32),
UserId (guid),
Subject (string),
Views (int32),
CreateDate (DateTime)

ForumPosts:
PostId (int32),
ThreadId (int32),
UserId (guid),
Post (string),
CreateDate (datetime)

Danke ...

War es hilfreich?

Lösung

Für den Namen des Benutzers angezeigt wird, wenn Sie die Mitgliedschaft verwenden und Sie wollen nicht die aspnet_Users in Ihrem dbml enthalten:

...
LastPostUserId = posts.OrderByDescending(p=>p.PostId).Take(1).Select(p=> Membership.GetUser(p.UserId))
...

Eine weitere Änderung Ihrer posted Probe ein bisschen besser zu machen ist, die OrderByDescending in den Pfosten hinzufügen Variable: Dann können Sie die 4-mal wiederholt OrderByDescending aus der select-Klausel fallen:

from forum in Forums
let posts = ForumPosts.Where(p => p.ForumThreads.ForumId.Equals(forum.ForumId)).OrderByDescending(p=>p.PostId)
select new
{
    Forum = forum.Title,
    Description = forum.Description,
    Topics = forum.ForumThreads.Count(),
    Posts = posts.Count(),
    LastPostId = posts.Take(1).Select(p=>p.PostId),
    LastPostThreadId = posts.Take(1).Select(p=>p.ThreadId),
    LastPostUserId = posts.Take(1).Select(p=>p.UserId),
    LastPostTime = posts.Take(1).Select(p=>p.CreateDate)
}

oder sogar sauber:

from forum in Forums
let posts = ForumPosts.Where(p => p.ForumThreads.ForumId.Equals(forum.ForumId))
let lastPost = posts.OrderByDescending(p=>p.PostId).Take(1)
select new
{
    Forum = forum.Title,
    Description = forum.Description,
    Topics = forum.ForumThreads.Count(),
    Posts = posts.Count(),
    LastPostId = lastPost.PostId,
    LastPostThreadId = lastPost.ThreadId,
    LastPostUserId = lastPost.UserId,
    LastPostUserName = Membership.GetUser(lastPost.UserId),
    LastPostTime = lastPost.CreateDate
}

Mit diesem Code testen, wenn es keine letzten Beiträge tho, ich denke, es könnte einen Fehler aus, wenn (1) Nehmen null ..

Andere Tipps

from forum in forums
from posts in db.ForumPosts.Where(p => p.Thread.ForumId.Equals(forum.ForumId))
select new
{
Forum = forum.Title, 
Topics = forum.ForumThreads.Count(),
Posts = posts.Count(),
LastPostBy = posts.OrderByDescending(p => p.CreateDate).FirstOrDefault(p => p.UserId),
LastPostTime= posts.Max(p => p.CreateDate))
}

ungetestet ofcourse, sondern versuchen, von hier aus und überprüfen Sie die SQL-Abfrage zu starten (s) es führt und lassen Sie mich wissen, ob es zu optimieren muss.

Das fast funktioniert der Trick (obwohl es eine schreckliche SQL erzeugt; -) ...)

from forum in Forums
let posts = ForumPosts.Where(p => p.ForumThreads.ForumId.Equals(forum.ForumId))
select new
{
    Forum = forum.Title,
    Description = forum.Description,
    Topics = forum.ForumThreads.Count(),
    Posts = posts.Count(),
    LastPostId = posts.OrderByDescending(p=>p.PostId).Take(1).Select(p=>p.PostId),
    LastPostThreadId = posts.OrderByDescending(p=>p.PostId).Take(1).Select(p=>p.ThreadId),
    LastPostUserId = posts.OrderByDescending(p=>p.PostId).Take(1).Select(p=>p.UserId),
    LastPostTime = posts.OrderByDescending(p=>p.PostId).Take(1).Select(p=>p.CreateDate)
}

Das Letzte, was - ich habe eine Beziehung von SQL-Tabelle ‚Forumbeiträgen‘ auf ‚Aspnet_Users‘, und ich möchte die Spalte Aspnet_Users.UserName als LastPostUserName anzuzeigen ..., wie das getan werden kann? Und wie würden Sie die gesamte Abfrage optimieren?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top