我有一个使用Entity Framework 4的C#-4 MVC3 RC测试应用程序。
我有这个方法:
public static List<Content> FetchMenu(int websiteID) {
return (from w in ContextHelper.Current.Websites
where w.WebsiteID == websiteID
select w.Contents).ToList();
}
此处涉及的对象(内容和网站)属于EntityObject。
上面的函数给出了编译错误:
Cannot implicitly convert type 'System.Linq.IQueryable<System.Collections.Generic.List<Manager.Models.Content>>' to 'System.Collections.Generic.List<Manager.Models.Content>'. An explicit conversion exists (are you missing a cast?)
w.Contents是一个EntityCollection<Content>
类型的集合。
如何推迟Linq.IQueryable类型以返回类型为Content的通用List?
答案 0 :(得分:2)
您需要使用括号,以便将ToList()
应用于整个查询(IQueryable
类型的对象):
public static List<Content> FetchMenu(int websiteID) {
return (from w in ContextHelper.Current.Websites
where w.WebsiteID == websiteID
select w.Contents).ToList();
}
否则,您仅在ToList()
上呼叫w.Contents
,之后会应用select
。如果我展示方法链接语法可能会更清楚。
您的版本:
ContextHelper.
Current.
Websites.
Where(w => w.WebsiteID == websiteID).
Select(w => w.Contents.ToList());
正确版本:
ContextHelper.
Current.
Websites.
Where(w => w.WebsiteID == websiteID).
Select(w => w.Contents).
ToList();
修改强>:
由于w.Contents
是一个集合,您需要使用SelectMany
将其展平:
public static List<Content> FetchMenu(int websiteID) {
return ContextHelper.
Current.
Websites.
Where(w => w.WebsiteID == websiteID).
SelectMany(w => w.Contents).
ToList();
}
答案 1 :(得分:0)
var query = (from w in ContextHelper.Current.Websites
where w.WebsiteID == websiteID
select w.Contents).First();
return query.ToList();
.First()似乎可以做到这一点......谢谢。
答案 2 :(得分:0)
SelectMany()
的Yakimych's answer是正确的。为了完整性,这里使用“查询理解”语法:
public static List<Content> FetchMenu(int websiteID) {
return (from w in ContextHelper.Current.Websites
where w.WebsiteID == websiteID
from c in w.Contents
select c).ToList();
}