linq-to-sql - AutoMapper 是否支持 Linq?

标签 linq-to-sql automapper

我对具有延迟加载功能的 Linq to SQL 非常感兴趣。在我的项目中,我使用 AutoMapper 将 DB 模型映射到域模型(从 DB_RoleInfoDO_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/

相关文章:

asp.net-mvc - 将序列化的 JQuery 可排序结果提交到数据库的最佳方法是什么?

linq - where 子句的通用表达式 - "The LINQ expression node type ' Invoke' 在 LINQ to Entities 中不受支持。”

c# - 如何在 .Net Core Web API 项目中对使用 Mapper 的方法进行单元测试

c# - Automapper - 缺少类型映射配置或不受支持的映射

c# - LINQ to SQL 和并发问题

linq - 想要一个查询在 Linq 查询中按变量排序

在 Visual Studio Team Services 中的托管生成代理上进行 Nuget 还原时,找不到 AutoMapper 包 5.1.1

c# - AutoMapper 映射函数到成员的获取

visual-studio-2008 - 在构建安装项目时,如何阻止 SQL Server 2008 R2 尝试安装某些程序包?

automapper - 在 AutoMapper 问题中使用 string.Split()