В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid)
Я получаю следующую ошибку:
Невозможно создать постоянное значение тип 'Phoenix.Intranet.Web.ClientSettings.ComponentRole. Только примитивные типы (такие как Int32, String и Guid ') поддерживаются в этот контекст.
Я понимаю, почему возникает ошибка. Я не понимаю, почему мой код создает ошибку. Мои сравнения против примитивных типов. Все сравнения приведены в Руководстве. В ошибке указано, что гиды в порядке.
Ошибка в этой строке (внизу):
var vla = (from cir in phoenixEntities.ComponentInRoles
Код:
List<ComponentRole> roles;
using (IMSMembershipEntities entities = new IMSMembershipEntities())
{
roles = (from role1 in entities.Roles
select new ComponentRole{Name = role1.RoleName, RoleId = role1.RoleId} ).ToList();
}
List<Components> componentInRoles;
using (PhoenixEntities phoenixEntities = new PhoenixEntities())
{
phoenixEntities.ContextOptions.LazyLoadingEnabled = false;
componentInRoles = (from component in phoenixEntities.Components
select new Components{Name = component.Name,
ComponentId = component.ComponentId,
//InRoles = (from componentInRole in phoenixEntities.ComponentInRoles
// join role in roles on componentInRole.RoleId equals role.RoleId
// where componentInRole.ComponentId == component.ComponentId
// select new ComponentRole{RoleId = role.RoleId, Name = role.Name})
}
).ToList();
foreach (Components cmpent in componentInRoles)
{
Components cmpent1 = cmpent;
//cmpent.InRoles =
var vla = (from cir in phoenixEntities.ComponentInRoles
join role in roles on cir.RoleId equals role.RoleId
where cir.ComponentId == cmpent1.ComponentId
select role).ToList();
}
}
Ответы
Ответ 1
EntityFramework и Linq to SQL оба пытаются перевести такие запросы, часть которых находится в памяти, а другая часть - в базе данных, в оператор sql IN
.
и потому, что ваш класс, роли которого является IEnumerable, не является примитивным типом, он не может быть переведен в SQL-запрос.
вы должны сначала извлечь из базы данных в память и затем соединить два списка в памяти.
например:
var vla = (from cir in phoenixEntities.ComponentInRoles.ToList()
join role in roles on cir.RoleId equals role.RoleId
where cir.ComponentId == cmpent1.ComponentId
select role).ToList();
Надеюсь, я помог