私は非常にlinqのSQLと少し援助が必要です。Linq to Sql - テーブルの結果とカウントを返す
基本的に私はC#でメッセージボードを構築しています。私は3つのデータベーステーブルを持っています - 基本的な情報は次のとおりです。
フォーラム forumid 名
THREADS は forumid タイトル ユーザーIDに postid が テキスト ユーザーID 日
は基本的に私は、私は必要なすべてを取り戻すしたいにスレッドID
投稿をスレッドID 1つのクエリで私は(特定のフォーラムの)スレッドのページを一覧表示し、そのスレッドの行にPOSTSの数を表示し、その最後の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は、私は今、各スレッドでの投稿数と、各スレッドの最後の投稿の日付を取得する必要があります。
すべてのヘルプは、最も高く評価されるだろう:)
EDIT
こんにちはみんなを。これまでのご協力ありがとうございます。基本的に私はほとんどそこにいる。しかし、私は最初の質問から、最後のPOSTを行った人のユーザー名を取得する必要があるという点で重要な部分を残しました。したがって、USERS表のp.useridとu.useridを結合する必要があります。これまでのところ、私は次のことを持っていますが、ちょうどUSERテーブルで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;
}
私は最終的にすべてのおかげでそれの一部を考え出しましたあなたの人の:)。私の唯一の問題は、検索結果メソッドです。
where (t.title.Contains(text) || p.text.Contains(text)) && t.hide == "No"
ので、新しいLINQメソッドにこの句を組み込む:私は新しい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();
}
注:現時点では、このようなものです。すべてのヘルプは感謝して受信された:)
SOLUTION:
を私は解決策を考え出したが、その1最高または最も効率的かどうかは知りません。多分あなたは私がまだ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