سؤال

أنا أرميز هذا المنتدى وبما أنني جديد في LINQ، فقد ركضت في هذه المشكلة عندما يضرب المستخدم الصفحة الرئيسية. أريد جدول يعرض قائمة من المنتديات مثل هذا:

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

لدي جداول SQL التالية:

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)

شكرا لك...

هل كانت مفيدة؟

المحلول

لعرض اسم المستخدم إذا كنت تستخدم العضوية ولا تريد تضمين ASPNET_USERS في DBML الخاص بك:

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

تغيير آخر لإجراء عينة منشورة أفضل قليلا هو إضافة OrderByDescending في متغير المشاريع: ثم يمكنك إسقاط OrderbyDeskending 4 مرات من جملة Select:

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)
}

أو حتى منظف:

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
}

اختبار هذا الرمز عندما لا توجد مشاريع الأخيرة Tho، أعتقد أنه قد يرمي خطأ إذا أخذ (1) فارغ ..

نصائح أخرى

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))
}

لم يتم اختبارها، ولكن حاول أن تبدأ من هنا وتحقق من استعلام (SQL) الذي ينفذه واسمحوا لي أن أعرف ما إذا كان يحتاج إلى تحسين.

هذا تقريبا يفعل الخدعة (على الرغم من أنه يولد بعض SQL الرهيبة؛ -) ...)

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)
}

آخر شيء - لدي علاقة من طاولة SQL "forumposts" إلى "ASPNET_USERS" وأود أن عرض العمود ASPNET_USERS.USERNAME باسم LastyPostustername ... كيف يمكن القيام بذلك؟ وكيف يمكنك تحسين الاستعلام كله؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top