#vb.net #linq-to-entities #parent-child
#vb.net #linq-to-entities #родитель-потомок
Вопрос:
В принципе, у меня есть следующее:
Dim ctx As New AdminCoreEntities
Dim roles = (From r In ctx.Roles where r.Name.StartsWith("cust") Select r) 'list of System.Linq.IQueryable(Of AdminCoreModel.Role)
Dim items = From i In ctx.QuickLinks.Include("Roles")
Where (i.TenantID = "470556ba-3574-4b01-a619-b85e9721b966" AndAlso i.Roles.Contains(roles))
Select New With {
i.ID,
i.Name,
.Roles = (From r In i.Roles Select New With {.Id = r.ID, .Name = r.Name})
}
Ошибка, которую я получаю при запуске этого:
Невозможно привести объект типа System.Data.Objects.ObjectQuery`1[AdminCoreModel.Role] для ввода AdminCoreModel.Role
В принципе, у меня ситуация «многие ко многим», и я пытаюсь получить все объекты Quicklinks, запрашиваемые их ролями, и не совсем уверен, почему EF будет приводить к одной AdminCoreModel.Роль, когда i.Роли — это коллекции объектов.
Любая помощь с благодарностью
Ответ №1:
Ну, .Contains()
ожидает один Role
, и вы передаете ему список. Вот что говорит ошибка.
Попробуйте (заранее извиняюсь, если я искажу VB.NET синтаксис; Обычно я не пишу VB.NET ):
Dim ctx As New AdminCoreEntities
Dim items = From i In ctx.QuickLinks ' You don't need Include because you're projecting.
Where (i.TenantID = "470556ba-3574-4b01-a619-b85e9721b966"
AndAlso i.Roles.Any(Function(role) role.Name.StartsWith("cust"))
Select New With {
i.ID,
i.Name,
.Roles = (From r In i.Roles Select New With {.Id = r.ID, .Name = r.Name})
}
Комментарии:
1. Большое спасибо, что сделал это, я использовал: AndAlso i.Роли. Любые (функциональные (роли) роли. Содержит(роль. ИДЕНТИФИКАТОР)), исходные роли. StartsWith был просто примером здесь, мне действительно нужно было запросить коллекцию идентификаторов ролей: исходная коллекция — Dim roles = (Из r в ctx.Roles, где rolesIds . Содержит(r.ID ) Выберите r.ID ).ToList()