EF4 Linq返回类型通用列表

时间:2010-11-20 22:17:43

标签: collections entity-framework-4 asp.net-mvc-3

我有一个使用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?

3 个答案:

答案 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();
}