Как перебрать несколько левых соединений LINQ to SQL - PullRequest
2 голосов
/ 04 июня 2011

Когда я пытаюсь перебрать этот метод SQL to 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);

Это лишь один из примеров различных подходов, которые я использовал.

РЕДАКТИРОВАТЬ: уточнил, что я хочу более конкретно.

Ответы [ 2 ]

1 голос
/ 04 июня 2011

Я собираюсь добавить еще один ответ по запросу оригинального постера. Я использую Entity Framework и имею определенные ассоциации , которые используются в моем примере. Моя модель данных (для целей этого примера) состоит из трех таблиц, поскольку существует отношение многие ко многим, но ваша модель будет проще, если для отношения один ко многим есть только таблицы категорий и форумы (плюс дополнительные таблицы поиска)

Итак, моя модель данных (физическая)

  • 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);
}
0 голосов
/ 04 июня 2011

Я думаю, что ваш вид был причиной проблемы, но после дальнейшего рассмотрения ...

У меня есть еще одна мысль, ваш 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...