Почему LINQ to Entities не позволяет мне инициализировать только некоторые свойства Entity?

Итак, я начал добавлять Entity Framework 4 в устаревшее веб-приложение (ASP.NET WebForms).

Для начала я автоматически сгенерировал некоторые объекты из базы данных. Также я хочу применить шаблон репозитория.

Существует объект с именем Visitor и его репозиторий VisitorRepository.

В VisitorRepository у меня есть следующий метод:

public IEnumerable<Visitor> GetActiveVisitors()
{
    var visitors = 
        from v in _context.Visitors
        where v.IsActive
        select new Visitor
        {
            VisitorID = v.VisitorID,
            EmailAddress = v.EmailAddress,
            RegisterDate = v.RegisterDate,
            Company = v.Company,
            Position = v.Position,
            FirstName = v.FirstName,
            LastName = v.LastName
        };

    return visitors.ToList();
}

Обратите внимание, что у посетителя больше свойств, чем те, я просто не хочу получать все, потому что есть несколько тяжелых полей TEXT.

Затем этот список привязывается к повторителю, и при попытке выполнить <%# Eval('EmailAddress') #%> он выдает следующее исключение.

The entity or complex type 'Model.Visitor' cannot be constructed in a LINQ to Entities query.

А) Почему это происходит? Как я могу обойти это? Нужно ли мне выбирать анонимный тип, а затем использовать его для частичной инициализации моих сущностей??? Я не хочу делать SELECT *, потому что здесь есть несколько тяжелых столбцов TEXT, которые мне не нужны

Б) Почему в каждом примере, который я видел, используется "выбрать новый" (анонимный объект) вместо инициализации известного типа? Анонимные типы бесполезны, если вы не извлекаете данные и не показываете их в том же слое. Насколько я знаю, анонимные типы нельзя возвращать из методов? Так какой в ​​них смысл???

Спасибо вам всем


person empz    schedule 29.04.2010    source источник
comment
Какая связь между tblVisitor и посетителем?   -  person Raj Kaimal    schedule 29.04.2010
comment
Извините, опечатка. Это все Посетитель для целей примера.   -  person empz    schedule 29.04.2010


Ответы (1)


а) Это происходит потому, что Посетитель является сущностью. Вы могли бы сказать следующее, понимая, что вы не сможете обновить базу данных через результирующие объекты вне контекста данных в репозитории:

var visitors = 
    from v in _context.Visitors
    where v.IsActive
    select v;

б) Я не знаю, на какой пример вы смотрите, но вы правы, говоря, что передача набора анонимных типов из репозитория на уровне данных в графический интерфейс — это не то, что вам нужно. Вы можете использовать объекты с самостоятельным отслеживанием или объекты передачи данных (DTO). В этой статье MSDN подробно описаны ваши варианты.

person Tom Cabanski    schedule 29.04.2010
comment
Я думаю, мой вопрос был недостаточно ясен. Я знаю, что могу выбрать весь объект таким образом, но я просто хочу получить некоторые поля (не SELECT *), потому что есть некоторые тяжелые поля TEXT, которые мне не нужны. Я обновил свой вопрос. - person empz; 29.04.2010
comment
@Tom по-прежнему прав, чтобы выбрать только несколько полей, вы должны проецировать на тип не сущность. - person Craig Stuntz; 29.04.2010
comment
Да, я не знал, что не могу проецироваться на тип сущности. Поэтому я думаю, что я бы создал классы POCO для проектирования. - person empz; 29.04.2010
comment
POCO или анонимные типы; либо один. - person Craig Stuntz; 30.04.2010