2011-01-31 5 views
0

Я пытаюсь загрузить пользовательский объект, используя linq из контекста данных сущности. Вот мой кодEf CTP5: help help

from category in _db.GetQueryable<DataModels.Category>() 
select new Category 
{ 
    Id = category.Id, 
    Name = category.Name, 
    CreatedBy = category.CreatedBy.HasValue ? new Login { Id = category.CreatedBy ?? Guid.Empty } : null 
} 

//Note: GetQueryable<DataModels.Category> actually use Set<DataModels.Category>() in DataContext class. 

Но он генерирует следующее сообщение об ошибке:

Unable to create a constant value of type 'CodeOnly.EF.DomainModels.Login'. Only primitive types ('such as Int32, String, and Guid') are supported in this context. 

Но выше код всегда будет работать, если я использую Linq2SQL.

Любая идея, как я могу добиться этого в сценарии только кода EF5.

+0

Просто дикая догадка здесь, но вы получаете ту же ошибку, если вы переместили выражение 'CreatedBy' в отдельное предложение' let'? Таким образом вы перемещаете это из проекции. –

+0

CreatedBy здесь является свойством категории datamodel (нулевой GUID). Так что не уверен, как «let» здесь полезен – learner

+0

Какой тип 'CreatedBy' в классе' Category'? Если это «Логин» (как указано вами, вы устанавливаете его значение в «новый вход»), или это руководство (как указано в «Id = category.CreatedBy ?? Guid.Empty')? –

ответ

0

Возможно, вам просто нужно получить данные из базы данных Category, прежде чем вы начнете проецировать их в пользовательские типы.

Только получите то, что вам нужно, но затем позвоните ToList() в свою коллекцию, чтобы выполнить выполнение и получить его из базы данных. Тогда вы сможете свободно проецироваться в любой тип, который вам нужен.

var items = _db.GetQueryable<DataModels.Category>().ToList(); 
from category in items 
select new Category 
{  
    Id = category.Id, 
    Name = category.Name, 
    CreatedBy = category.CreatedBy.HasValue 
     ? new Login { Id = category.CreatedBy ?? Guid.Empty } : null 
} 

редактировать: новая информация приходит к свету, новые идеи пружинные вперед - попробуйте это:

partial class Category 
{ 
    public Category(int id, string name, Guid? createdByGuid) 
    { 
     Id = id; 
     Name = name; 
     CreatedBy = createdByGuid.HasValue ? new Login { Id = createdByGuid.Value } : null; 
    } 
} 

var items = _db.GetQueryable<DataModels.Category>().ToList(); 
from category in items 
select new Category(category.Id, category.Name, category.CreatedBy) 

Я также задаюсь вопросом, почему в вашем первоначально вопросе вы проверяете Guid? дважды за нуль (HasValue и ??) - однако я не думаю, что это то, что вызывает у вас проблемы.

+0

Но я хочу вернуть IQueryable из своего репозитория. Так что мой уровень сервиса может изменить запрос в другой ситуации без выполнения запроса. Если я вызываю ToList, тогда запрос будет выполнен в это время, и в память будет помещена любая фильтрация. Если у меня 2000 записей, я не хочу этого делать. – learner

+0

Это справедливо, возможно, вам следует сделать этот прогноз дальше по линии - в вашем слое обслуживания? Я думаю, проблема заключается в том, что репозиторий не может создавать новые объекты ('new Login'), поэтому вам нужно сделать это над вашей базой данных. –

+0

Я использую DataModel в моем репозитории и DomainModel в уровне обслуживания. Поскольку DataModel является объектом-кандидатом, поэтому я не хочу передавать его на уровень сервиса. Просто хочу передать нестандартную модель весового домена, или вы можете сказать POCO. Вот почему я после решения конвертировать мои данные в domainmodel из репозитория. Это отлично работает с LINQ2SQL, но сталкивается с проблемой с EF5. – learner