나는 아주 SQL에 linq에 약간의 도움이 조금 필요합니다.Linq하려면 SQL 반환 - 테이블 결과 및 계산
기본적으로 저는 C#에서 메시지 게시판을 만들고 있습니다. 나는 3 개의 데이터베이스 테이블을 가지고있다 - 기본 정보는 다음과 같다.
게시판 forumid 이름
THREADS 는 forumid 제목 사용자 ID를 postid 이 텍스트 사용자 ID 날짜
은 기본적으로 내가 필요한 모든 것을 다시 가지고 싶어에게 threadid
게시물을 threadid 하나의 검색어로 THREADS (특정 FORUM에 대한) 페이지를 나열하고 해당 THREAD 행에 POSTS 수를 표시하고 마지막 POST가 해당 THREAD에 대한 것이 었으면합니다.
순간마다 나는 모든 스레드를 다시 가져 오는 중 각 결과 집합을 반복하고 POST 스레드에 대한 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 테이블에서 p.userid와 u.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;
}
내가 마지막으로 모두에게 감사와 그것의 그 부분을 알아 냈어 너희들 :). 내 유일한 문제는 이제 검색 결과 방법입니다. 순간 그것은 다음과 같이이다 : 나는 새로운 LINQ 코드로 where 절을받을 필요가
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 (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;
}
LINQ를 처음 사용하기 때문에 http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b를 방문하는 것이 좋습니다. 이 작업을 수행하는 방법을 파악할 때 매우 유용합니다. – JamieSee