我對linq to sql非常陌生,需要一點幫助。Linq To Sql - 返回表結果和計數
基本上我在C#中建立一個留言板。我有3個數據庫表 - 基本信息如下。
論壇 forumid 名
THREADS 線程ID forumid 標題 用戶ID
帖子 帖子ID 線程ID 文本 用戶ID 日期
基本上我想帶回我需要的一切在一個查詢中。我想列出一個THREADS頁面(針對特定的FORUM),並顯示該THREAD行中的POSTS數量以及最後一次POST的時間。
目前,我回來了所有THREADS,然後遍歷每個結果集,並單獨調用POST表中的線程和最新帖子的POST計數,但顯然這會導致問題在留言板越來越大的情況下擊中數據庫。
我的Linq到至今SQL:
public IList<Thread> ListAll(int forumid)
{
var threads =
from t in db.Threads
where t.forumid == forumid
select t;
return threads.ToList();
}
basicaly我現在需要得到每個線程職位的數量和每個線程的最後一個職位的日期。
任何幫助將是非常讚賞:)
編輯
人喜。感謝迄今爲止的幫助。基本上我幾乎在那裏。但是,在我最初的問題中,我留下了一個重要部分,因爲我需要檢索製作最後一個POST的人員的用戶名。因此,我需要在USERS表上與u.userid一起使用p.userid。到目前爲止,我有以下的,但只需要修改本加盟POST表與用戶表:
public IList<ThreadWithPostInfo> ListAll(int forumid)
{
var threads = (from t in db.Threads
where t.forumid == forumid
join p in db.Posts on t.threadid equals p.threadid into j
select new ThreadWithPostInfo() { thread = t, noReplies = j.Count(), lastUpdate = j.Max(post => post.date) }).ToList();
return threads;
}
UPDATE:
public IList<ThreadWithPostInfo> ListAll(int forumid)
{
var threads = (from t in db.Threads
from u in db.Users
where t.forumid == forumid && t.hide == "No" && t.userid == u.userid
join p in db.Posts on t.threadid equals p.threadid into j
select new ThreadWithPostInfo() { thread = t, deactivated = u.deactivated, lastPostersName = j.OrderByDescending(post => post.date).FirstOrDefault().User.username, noReplies = j.Count(), lastUpdate = j.Max(post => post.date) }).ToList();
return threads;
}
我終於想通它的一部分了,非常感謝所有你們:)。我現在唯一的問題是搜索結果方法。目前,它是這樣的:
public IList<Thread> SearchThreads(string text, int forumid)
{
var searchResults = (from t in db.Threads
from p in db.Posts
where (t.title.Contains(text) || p.text.Contains(text)) && t.hide == "No"
&& p.threadid == t.threadid
&& t.forumid == forumid
select t).Distinct();
return searchResults.ToList();
}
請注意,我需要在where子句進入新的LINQ代碼:
where (t.title.Contains(text) || p.text.Contains(text)) && t.hide == "No"
所以將這一條款列入新的LINQ方法。任何幫助感激地接受:)
SOLUTION:
我想出了一個解決方案,但我不知道它最好的,最有效的。也許你們可以告訴我,因爲我仍然對linq很感興趣。詹姆斯·我想你的答案是最接近的,並讓我到附近的地方,我想是 - 感謝:)
public IList<ThreadWithPostInfo> SearchThreads(string text, int forumid)
{
var searchResults = (from t in db.Threads
from p in db.Posts
where (t.title.Contains(text) || p.text.Contains(text)) && t.hide == "No"
&& p.threadid == t.threadid
&& t.forumid == forumid
select t).Distinct();
//return searchResults.ToList();
var threads = (from t in searchResults
join p in db.Posts on t.threadid equals p.threadid into j
select new ThreadWithPostInfo() { thread = t, lastPostersName = j.OrderByDescending(post => post.date).FirstOrDefault().User.username, noReplies = j.Count(), lastUpdate = j.Max(post => post.date) }).ToList();
return threads;
}
由於您是LINQ的新手,我強烈建議您訪問http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b。當試圖弄清楚如何做這件事時,這非常有幫助。 – JamieSee 2011-12-22 18:22:36