Набор представляет собой неупорядоченную группу различных объектов - не допускается дублирование объектов. Он обычно реализуется с использованием хеш-кода вставляемых объектов. (Конкретные реализации могут добавить упорядочение, но сам интерфейс Set не делает.)
Список - упорядоченная группа объектов, которая может содержать дубликаты. Он может быть реализован с помощью ArrayList
, LinkedList
и т. Д.
Я думаю, что один из способов добиться того, что вы пытаетесь сделать, это сделать следующее:
var query= PagesContext.Versions.Where(ve=>ve.ContentStatusID == 2)
.SelectMany(ve=>ve.View.Roles
.Where(r=>r.IsAdminRole == false)
.Select(r=> new RestrictedPage
{
ViewID = ve.ViewID,
Title = ve.Title,
RoleID = r.ID,
Role = r.Role1,
VersionID = ve.VersionID
})).ToList();
В вашем случае таблица соединений не отображается напрямую, это скрыть, так что одно решение для получения данных связано вам нужно использовать метод расширения SelectMany
. Сначала примените условие к одному из концов запроса, в моем примере это было Versions
, а затем примените SelectMany
, которое будет генерировать внутреннее соединение между обеими таблицами и сгладить результат в одной коллекции.
Я думаю, что проблема в том, что версия и View
на самом деле не связаны напрямую с вашей БД, поэтому вы собираетесь сделать явное внутреннее соединение:
var query= PagesContext.Versions.Where(ve=>ve.ContentStatusID == 2)
.Join( PagesContext.Views, ve=>ve.ViewId, v=>v.ID,(ve,v)=>v)
.SelectMany(v=>v.Roles
.Where(r=>r.IsAdminRole == false)
.Select(r=> new RestrictedPage
{
ViewID = ve.ViewID,
Title = ve.Title,
RoleID = r.ID,
Role = r.Role1,
VersionID = ve.VersionID
})).ToList();