从一对多关系中检索数据

时间:2009-12-15 07:10:59

标签: asp.net-mvc linq-to-sql

我正在尝试从ASP.NET MVC应用程序中的一对多关系中检索数据。

假设我有两个表帖子和类别,其中包含以下属性:

帖子 -ID -标题 -category_id

类别 -ID -名称 -author

我想抓住属于某个类别的帖子,并从该类别中获取.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);
}

该模型抱怨它无法将Anonymous类型的IQueryable转换为IQueryable&lt;发布&gt;。我怀疑是因为我正在做Select new {},但我不确定 如果我只执行IQueryable,那么我没有在视图中使用ToList()方法。

所以,我迷路了。你能帮我吗? (顺便说一句,我是这个asp.net mvc的新手。)

2 个答案:

答案 0 :(得分:2)

我认为问题在于您尝试在单个方法范围之外使用var。在您的投影阶段尝试新建一个Post对象而不是匿名类型。 e.g。

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 :(得分:1)

Lazarus在评论中回答了这个问题。您的方法声明声明了Post类型的IQueryable的返回类型

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
                  };
}