在多个 EF 查询中重用 ViewModel 实体化器?

Reuse ViewModel materializer in multiple EF queries?

我想重用从 Entity Framework 6 IQueryable<TEntity> 中合成视图模型的方法。对我来说最直观的是,它看起来像这样:

ViewModel ToViewModel(Record record) {
    return new ViewModel {
        Title = record.Title
    }
}

// Get a single ViewModel
ViewModel GetRecord(int id) {
    return ToViewModel(Context.Records.Find(id));
}

// Get multiple ViewModels
IEnumerable<ViewModel> GetRecords() {
    return
        from record in Context.Records
        select ToViewModel(record);
}

不幸的是,EF 尝试将 ToViewModel() 方法发送到数据库,因此枚举查询结果导致类似于 "this method cannot be translated into a store expression".

的异常

出于性能原因,通常我不希望通过网络加载整个 Entity<Record>(以及初始化程序中引用的所有相关对象),否则我可以执行以下操作:

IEnumerable<ViewModel> GetRecords() {
    return
        from record in Context.Records.ToList()
        select ToViewModel(record);
}

我觉得我在 Expression 打字时忽略了一些相当简单的事情。想法?

是的,您认为应该使用 Expression 是正确的。准备方法和一个新的助手,像这样:

public static Expression<Func<Record, ViewModel>> GetToViewModelExpression() {
    return r => new ViewModel {
        Title = r.Title
    };
}

public static ViewModel ToViewModel(Record record) {
    return GetToViewModelExpression().Compile()(record);
}

并像这样在你的依赖方法中使用它:

// Get a single ViewModel
ViewModel GetRecord(int id) {
    return ToViewModel(Context.Records.Find(id));
}

// Get multiple ViewModels
IEnumerable<ViewModel> GetRecords() {
    return Context
        .Records
        .Select(GetToViewModelExpression());
}