我正在尝试从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的新手。)
答案 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
};
}