EF select to POCO из "сложного" объекта не скомпилируется - PullRequest
0 голосов
/ 21 января 2012

Это мой метод выдачи ошибки.

public List<StatusViewModel> GetStatuses(){
    using(var ctx = new AppStatusEntities()){

          var result = ctx.GetLatestStatuses().Select(r => new StatusViewModel
            { 
                r.ApplicationId,
                r.ApplicationName,
                r.ApplicationStatus,
                r.LastRun                   
            }).ToList();

          return result;
    }
}

StatusViewModel - это POCO.

public class StatusViewModel{
    public Guid ApplicationId {get;set;}
    public string ApplicationName {get;set;}
    public string ApplicationStatus {get;set;}
    public DateTime LastRun {get;set;}        
}

Сообщение об ошибке:

Cannot initialize type 'StatusViewModel' with a collection initializer because it does not implement 'System.Collections.IEnumerable'

Я могу только предположить, что это как-то связано с типом возврата вызова хранимой процедуры, который является «сложным», как указано, когда я импортировал функцию в модели данных сущностей. Но я не могу понять, почему это имеет значение. Если я сделаю что-то вроде ctx.ApplicationStatus.Select(r => new StatusViewModel {..., где ApplicationStatus - это таблица, а не вызов хранимой процедуры, этот код будет скомпилирован без ошибок.

1 Ответ

1 голос
/ 22 января 2012

Попробуйте так:

var result = ctx.GetLatestStatuses().Select(r => new StatusViewModel
        { 
            ApplicationId = r.ApplicationId,
            ApplicationName = r.ApplicationName,
            ApplicationStatus = r.ApplicationStatus,
            LastRun = r.LastRun                   
        }).ToList();

Разница между вызовом хранимой процедуры и прямым доступом к ObjectSet заключается в реализации Linq. В первом примере с хранимой процедурой используется проекция приложения с использованием Linq-to-Objects, тогда как во втором примере используется проекция в SQL с использованием Linq-to-entity.

...