Вопрос

У меня есть C # -4 MVC3 RC Test-Application, которое использует 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 an. EntityCollection<Content> Тип коллекции.

Как отложить тип Linq.iquerable, чтобы вернуть универсальный список типа содержимого?

Это было полезно?

Решение

Вам нужно использовать скобки, так что вы применяете 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();
}

Другие советы

    var query = (from w in ContextHelper.Current.Websites
                 where w.WebsiteID == websiteID
                 select w.Contents).First();

    return query.ToList();

.First (), похоже, делает трюк ... Спасибо.

Ответ Якимича с использованием 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();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top