Я очень плохо знаком с linq to sql и нуждаюсь в небольшой помощи.
В основном я создаю доску объявлений на C #. У меня есть 3 таблицы базы данных - основная информация выглядит следующим образом.
ФОРУМЫ
Идентификационный код на форуме
Имя
НИТИ
ThreadId
Идентификационный код на форуме
заглавие
* 1007 Идентификатор_пользователя *
ПОСТЫ
сообщения дан
ThreadId
текст
Идентификатор пользователя
дата
По сути, я хочу вернуть все, что мне нужно, в одном запросе. Я хочу отобразить страницу THREADS (для определенного ФОРУМА), а также отобразить количество POSTS в этой строке THREAD и время, когда последний POST был для этой THREAD.
В настоящий момент я возвращаю все НИТИ, а затем перебираю каждый набор результатов и делаю отдельные вызовы таблицы POST для подсчета POST для потока и последнего сообщения в этой теме, но, очевидно, это вызовет проблемы сроки попадания в базу данных по мере увеличения доски объявлений.
My Linq To SQL на данный момент:
public IList<Thread> ListAll(int forumid)
{
var threads =
from t in db.Threads
where t.forumid == forumid
select t;
return threads.ToList();
}
В основном мне нужно получить количество сообщений в каждой теме и дату последнего сообщения в каждой теме.
Любая помощь будет наиболее ценится:)
EDIT
Привет, ребята. Спасибо за вашу помощь до сих пор. В основном я почти там. Тем не менее, я оставил важную часть моего первоначального вопроса в том факте, что мне нужно получить имя пользователя человека, который сделал последний POST. Поэтому мне нужно объединить p.userid с u.userid в таблице USERS. Пока у меня есть следующее, но мне просто нужно изменить это, чтобы соединить таблицу POST с таблицей USER:
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. Любая помощь с благодарностью получена:)
РЕШЕНИЕ:
Я нашел решение, но не знаю, является ли оно лучшим или наиболее эффективным. Может быть, вы, ребята, можете сказать мне, потому что я все еще думаю о 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;
}