В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid). - PullRequest
10 голосов
/ 30 июня 2011

Я получаю следующую ошибку:

Невозможно создать постоянное значение типа 'Phoenix.Intranet.Web.ClientSettings.ComponentRole'.В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid).

Я понимаю, почему возникает ошибка.Чего я не понимаю, так это почему мой код создает ошибку.Мои сравнения против примитивных типов.Все сравнения являются Guid to Guid.В частности, ошибка указывает на то, что с Guids все в порядке.

Ошибка возникает в этой строке (внизу):

 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 Ответ

18 голосов
/ 30 июня 2011

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();

Я надеюсь, что помог

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...