在多个 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());
}
我想重用从 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());
}