EF4 LINQ возвращаемый тип универсального списка
-
26-09-2019 - |
Вопрос
У меня есть 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();
}