我对具有延迟加载功能的 Linq to SQL 非常感兴趣。在我的项目中,我使用 AutoMapper 将 DB 模型映射到域模型(从 DB_RoleInfo
到 DO_RoleInfo
)。在我的存储库代码中,如下所示:
public DO_RoleInfo SelectByKey(Guid Key)
{
return SelectAll().Where(x => x.Id == Key).SingleOrDefault();
}
public IQueryable<DO_RoleInfo> SelectAll()
{
Mapper.CreateMap<DB_RoleInfo, DO_RoleInfo>();
return from role in _ctx.DB_RoleInfo
select Mapper.Map<DB_RoleInfo, DO_RoleInfo>(role);
}
SelectAll
方法运行良好,但是当我调用 SelectByKey
时,我收到错误:Method “RealMVC.Data.DO_RoleInfo MapDB_RoleInfo,DO_RoleInfo” could not translate to SQL.
是不是 Automapper 不完全支持 Linq?
我尝试了下面的手动映射代码,而不是 Automapper:
public IQueryable<DO_RoleInfo> SelectAll()
{
return from role in _ctx.DB_RoleInfo
select new DO_RoleInfo
{
Id = role.id,
name = role.name,
code = role.code
};
}
这种方法按我想要的方式工作。
最佳答案
虽然@Aaronaught 的回答在撰写本文时是正确的,但世界经常发生变化,AutoMapper 也随之改变。同时, QueryableExtensions
被添加到代码库中,增加了对转换为表达式的投影的支持,最后是 SQL。
核心扩展方法是ProjectTo
1. 这就是你的代码的样子:
using AutoMapper.QueryableExtensions;
public IQueryable<DO_RoleInfo> SelectAll()
{
Mapper.CreateMap<DB_RoleInfo, DO_RoleInfo>();
return _ctx.DB_RoleInfo.ProjectTo<DO_RoleInfo>();
}
它的行为类似于手动映射。 (此处
CreateMap
语句用于演示目的。通常,您会在应用程序启动时定义一次映射)。因此,只查询映射所需的列,结果是
IQueryable
仍然具有原始查询提供程序(linq-to-sql、linq-to-entities 等)。所以它仍然是可组合的,这将转化为 WHERE
SQL中的子句:SelectAll().Where(x => x.Id == Key).SingleOrDefault();
1
Project().To<T>()
在 v. 4.1.0 之前
关于linq-to-sql - AutoMapper 是否支持 Linq?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2212126/