Есть ли другой способ заставить этот запрос LINQ работать? - PullRequest
2 голосов
/ 08 мая 2011

Ну, у меня есть это: Совет:

    public class Board
{
    public int BoardID { get; set; }
    public string BoardName { get; set; }
    public string BoardDescription { get; set; }
    public int PostCount { get; set; }
    public int TopicCount { get; set; }
    public bool IsVisibile { get; set; }
    public Forum BelongToForum { get; set; }
    public List<Board> Boards { get; set; }
    public List<Topic> Topics { get; set; }
}

И Форум:

    public class Forum
{
    public int ForumID { get; set; }
    public string ForumName { get; set; }
    public string ForumDescription { get; set; }
    public List<Board> Boards { get; set; }
}

И способ получения форумов с досками:

        public List<Forum> GetForums()
    {
        List<Forum> forums = new List<Forum>();
        _ctx = new ForumContext();
        forums = (from p in _ctx.Forums
                  select p).ToList();
        List<Forum> returnForm = new List<Forum>();
        foreach(Forum forum in forums)
        {
            List<Board> board = (from x in _ctx.Boards
                                 where x.BelongToForum.ForumID == forum.ForumID
                                 select x).ToList();
            forum.Boards = board;

            returnForm.Add(forum);
        }


        return returnForm;
    }

Работает как положено. Но, как вы видите, я использую три списка и цикл foreach. Это выглядит не очень хорошо для меня. Итак, у меня есть вопрос, есть ли другой способ заставить его работать?

Думаю, мне следует создать другой модельный класс, который будет собирать необходимые данные из соединения или что-то в этом роде. Но что я хочу спросить, есть ли другие способы сделать это?

Ответы [ 2 ]

3 голосов
/ 08 мая 2011

Если вы посмотрите на вашу Forum сущность, у нее уже есть свойство Boards.Вы должны быть в состоянии материализовать те в одном запросе, используя Include().

 forums = (from p in _ctx.Forums.Include("Boards")
           select p).ToList();

Или используя строго типизированный Include():

 forums = (from p in _ctx.Forums.Include( x=> x.Boards)
           select p).ToList();

Можете ли вы уточнить, является ли этот код первымили БД первая?Из вашего примера это выглядит как DB сначала с моделями POCO (с кодом сначала свойство Boards должно быть уже материализовано, поскольку оно не помечено как виртуальное).

1 голос
/ 08 мая 2011

Это должно работать:

var returnForm =
    (
        from forum in _ctx.Forums
        join b in _ctx.Boards on forum.ForumID equals b.BelongsToForum.ForumID into boards
        select new { forum, boards }
    )
    .Select( x =>
        {
            x.forum.Boards = x.boards.ToList();
            return x.forum;
        } )
    .ToList();

Сложнее всего с назначением списка досок свойству forum.Boards. Это не совсем соответствует философии LINQ: LINQ - это создание следующего набора данных из предыдущего набора данных посредством какого-либо преобразования, а не изменение данных на месте.

По этой причине эта часть задания получилась немного безобразной.

Однако, если вы используете LINQ-to-entity, у него, вероятно, есть несколько более элегантных способов выполнить то, что вы пытаетесь достичь. Хотя я не большой профессионал в этой технологии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...