Извлечение данных из отношения один ко многим - PullRequest
0 голосов
/ 15 декабря 2009

Я пытаюсь извлечь данные из отношения «один ко многим» в приложении ASP.NET MVC.

Допустим, у меня есть две таблицы сообщений и категории со следующими атрибутами:

сообщения -Я бы -заглавие -category_id

категория -Я бы -название Авт

Я хочу получить сообщения, относящиеся к категории, и получить значения .name и .author из категории. Вот что у меня в модели:

public IQueryable<Post> GetPosts()
{
    return from post in db.Posts
            join categories in FindCategories()
            on categories.id equals post.category_id
            select new
            {
                title = post.title,
                name = categories.name,
                author = categories.author
            };
    }

А в контроллере:

public ActionResult Index()
{
    var allposts = postRepository.GetPosts().ToList();
    return View(allposts);
}

Модель жалуется, что не может преобразовать IQueryable типа Anonymous в IQueryable . Я подозреваю, что это потому, что я делаю Select new {}, но я не уверен.
Если я делаю только IQueryable, то у меня нет метода ToList (), доступного в представлении.

Итак, я потерян. Вы можете помочь? (и, кстати, я новичок в этом asp.net mvc).

Ответы [ 2 ]

2 голосов
/ 15 декабря 2009

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

public IQueryable<Post> GetPosts()
{
return from post in db.Posts
                join categories in FindCategories()
                on categories.id equals post.category_id
                select new Post()
                {
                        title = post.title,
                        name = categories.name,
                        author = categories.author
                };
}
1 голос
/ 15 декабря 2009

На вопрос ответил Лазарь в комментариях. В объявлении вашего метода указывается тип возврата IQueryable типа Post

public IQueryable<Post> GetPosts() { //...

Но ваш linq проектирует анонимный тип и возвращает IQueryable анонимного типа

select new { //anonymous type
  title = post.title,
  name = categories.name,
  author = categories.author
};  // = IQueryable<SomeCompilerGeneratedTypeNameHere>

Вам необходимо определить новый тип

public class PostDisplay {
  public string Title { get; set; }
  public string Name { get; set; }
  public string Author { get; set; }
}

затем в вашем коде верните IQueryable этого типа

public IQueryable<PostDisplay> GetPosts() {
  return from post in db.Posts
         join categories in FindCategories()
         on categories.id equals post.category_id
         select new PostDisplay {
                    Title = post.title,
                    Name = categories.name,
                    Author = categories.author
                  };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...