从“复杂”对象中选择EF到POCO将无法编译

时间:2012-01-21 18:35:52

标签: entity-framework-4 linq-to-entities

这是我提供错误的方法。

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 个答案:

答案 0 :(得分:1)

以这种方式尝试:

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投影您的应用程序,而第二个示例使用Linq-to-entities在SQL中使用投影。