EF4 Linq тип возвращаемого универсального списка - PullRequest
0 голосов
/ 21 ноября 2010

У меня есть тестовое приложение C # -4 MVC3 RC, которое использует Entity Framework 4.

У меня есть этот метод:

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?

Ответы [ 3 ]

2 голосов
/ 21 ноября 2010

Вам необходимо использовать скобки, чтобы применить 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();
}
0 голосов
/ 21 ноября 2010

ответ Якимича с использованием SelectMany() - это правильно. Для полноты здесь используется синтаксис «понимание запросов»:

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();
}
0 голосов
/ 21 ноября 2010
    var query = (from w in ContextHelper.Current.Websites
                 where w.WebsiteID == websiteID
                 select w.Contents).First();

    return query.ToList();

Кажется, что .First () помогает ... спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...