#c# #linq #asp.net-mvc-3
#c# #linq #asp.net-mvc-3
Вопрос:
Когда я пытаюсь выполнить цикл через этот метод SQL с LINQ, я получаю только все строки forum_category. Чего я действительно хочу, так это получить все строки из forum_category, а также вернуть все форумы, соответствующие идентификатору категории, вот ожидаемый результат:
FORUM_CATEGORY (categoryid, categorytitle)
- FORUM (forumid, forumtitle, forumdescrition) -> (latest topic => topicid, topictitle) -> (latest post on that latest topic => postid, postadded, username) -> total topic count, total post count in this forum only
- FORUM (forumid, forumtitle, forumdescrition) -> (latest topic => topicid, topictitle) -> (latest post on that latest topic => postid, postadded, username) -> total topic count, total post count in this forum only
- FORUM (forumid, forumtitle, forumdescrition) -> (latest topic => topicid, topictitle) -> (latest post on that latest topic => postid, postadded, username) -> total topic count, total post count in this forum only
FORUM_CATEGORY
- FORUM [...]
- FORUM [...]
- FORUM [...]
Вы поняли идею…
—
Вот что я в настоящее время получаю:
FORUM_CATEGORY
- FORUM (forumid, forumtitle, forumdescrition) -> (latest topic => topicid, topictitle) -> (latest post on that latest topic => postid, postadded, username) -> total topic count, total post count in this forum only
FORUM_CATEGORY
- FORUM (forumid, forumtitle, forumdescrition) -> (latest topic => topicid, topictitle) -> (latest post on that latest topic => postid, postadded, username) -> total topic count, total post count in this forum only
То есть только один форум для каждой категории форумов.
Вот код LINQ:
var forum = (from c in context.forum_category
join f in context.forum on c.id equals f.categoryid
join t in context.forum_topic on f.id equals t.forumid
join tc in context.forum_topic on f.id equals tc.forumid into tcount
join p in context.forum_posts on t.id equals p.topicid
join pc in context.forum_posts on t.id equals pc.topicid into pcount
join u in context.users on p.userid equals u.id
orderby p.added descending
select new ForumIndexModel
{
CategoryId = c.id,
CategoryTitle = c.title,
ForumId = f.id,
ForumTitle = f.title,
ForumDescription = f.description,
TopicId = t.id,
TopicTitle = t.title,
PostId = p.id,
PostAdded = p.added,
Username = u.username,
TopicCount = tcount.Count(),
PostCount = pcount.Count()
}).ToList();
return View(forum);
Это всего лишь один пример некоторых из различных подходов, которые я использовал.
РЕДАКТИРОВАТЬ: уточнил, что я хочу более конкретно.
Комментарии:
1. Вы хотите результат с (1) идентификатором postID и PostCount, TopicCount? Может ли сообщение принадлежать нескольким темам?
2. Сообщение не может принадлежать нескольким темам, с чего бы это?
3. Я не знаю. Почему у вас есть класс с postID и TopicCount?
4. В вашем классе ForumIndexModel есть только один форум для каждой категории. Разве у вас не должно быть List<Forum_Id>, List<Forum_title> или, что еще лучше, использовать класс Forum и использовать List<Forum> ? Что-то выглядит не так
5. DisplacedGuy, это именно то, что я пытаюсь сделать. Как бы я установил эти списки при выборе нового ForumIndexModel?
Ответ №1:
Я собираюсь добавить еще один ответ по запросу исходного плаката. Я использую Entity Framework и у меня есть определенные ассоциации, которые используются в моем примере. Моя модель данных (для целей этого примера) представляет собой три таблицы, потому что существует связь «многие ко многим», но ваша была бы проще, имея только таблицы category и forum для связи «один ко многим» (плюс addtl. найдите таблицы)
Итак, моя модель данных (физическая)
- lm_m_category
- lm_m_category_link (это таблица «многие ко многим»)
- lm_m_link
Я определил ассоциации в EF (nCat, nLink для перехода к категории или ссылке из таблицы внешних ссылок). EF обрабатывает соединения для вас таким образом.
Итак, код для загрузки этого не состоит из одной инструкции, но вы просили меня показать вам, как я мог бы это сделать, используя EF. Я не приводил примеры классов Category и Link, это простые классы id, desc, но у Category есть список ссылок. Моя физическая модель данных использует таблицы lm_m_ *.
List<Category> Categories = new List<Category>();
Category newCategory;
Link newLink;
foreach (var category in db.lm_m_category_link.Include("nCategory").Include("nLink").ToList())
{
newCategory = new Category();
newCategory.category_id = category.category_id;
newCategory.category_name = category.nCategory.nCat.category_name;
foreach (var link in (IEnumerable<lm_m_link>)category.nLink)
{
newLink = new Link();
newLink.link_id = link.link_id;
newLink.link_name = link.link_title;
newLink.link_url = link.link_url;
// add link to list
newCategory.category_links.Add(newLink);
}
// add category
Categories.Add(newCategory);
}
Комментарии:
1. Хотя это не совсем правильный ответ, который я искал, это помогло мне на правильном пути.
Ответ №2:
Я думал, что ваша сортировка вызывала проблему, но после дальнейшего рассмотрения…
У меня есть другая мысль, ваш ForumIndexClass выглядит неправильно для того, что вы хотите. Разве в вашем ForumIndexModel не должны быть списки (или IEnumerable) в столбцах форума? Вы присваиваете отдельные значения там, где должны быть списки. Ваш класс должен выглядеть больше как…
class ForumIndexModel
{
int CategoryId {get; set;}
string CategoryTitle {get; set;}
List<int> ForumIds {get; set;}
List<string> ForumTitles {get; set;}
List<string> ForumDescriptions {get; set;}
... you get the idea...
}
Чтобы выбрать в списках, сделайте что-то вроде этого:
public class C
{
A TheA {get;set;}
List<B> TheBs {get;set;}
}
//g is an IEnumerable<B> with a key property of A
List theResult =
(
from a in ListA
join b in ListB on a.ValueAB = b.ValueAB into g
select new C()
{
TheA = g.Key,
TheBs = g.ToList()
}
).ToList();
Комментарии:
1. Я получаю правильные данные, и изменение моего вида не имеет никакого значения. Тем не менее, я могу выполнить цикл по своим данным форума только один раз, по каждой категории, которая выполняется правильно.
2. Точно. Как бы я назначил эти списки через LINQ при выборе в ForumIndexModel?
3. хорошо, похоже, вы просматриваете ForumIndexModel после выбора… что означает, что мой второй ответ здесь, вероятно, тоже неверен, я виноват в том, что не получил разъяснений.
4. Обычно я использую Entity Framework и не знаю, как назначить list в одном операторе с использованием Linq, если это вообще возможно. Я хотел бы увидеть SQL, который linq сгенерировал для этого запроса, потому что похоже, что ваш запрос в порядке.
5. Я также использую Entity Framework. Но если я не могу сделать это в одном операторе, как я могу сделать это иначе?