Lambda 使用表达式和linq select映射重构

Lambda 使用表达式和linq select映射重构,lambda,linq-to-sql,refactoring,expression,Lambda,Linq To Sql,Refactoring,Expression,我的目标是以可伸缩的方式处理一些到DTO的映射,从而减少一些样板文件。我必须在这里使用Iqueryable,不能只调用.toList() 这件作品很好用。(还要注意的是,示例中显示了BusinessUnit的所有属性,不过我还有大约25个对象需要映射,其中一些是海量的) 及 必须有一种方法在这两种情况下重用此映射。我试着直接打分机。。例如: .Select(BusinessUnit.MapToMessage());但是,这不起作用,因为它无法将其转换为SQL 那么,我如何在只需构建一次映射的情况

我的目标是以可伸缩的方式处理一些到DTO的映射,从而减少一些样板文件。我必须在这里使用Iqueryable,不能只调用.toList()

这件作品很好用。(还要注意的是,示例中显示了BusinessUnit的所有属性,不过我还有大约25个对象需要映射,其中一些是海量的)

必须有一种方法在这两种情况下重用此映射。我试着直接打分机。。例如:

.Select(BusinessUnit.MapToMessage());但是,这不起作用,因为它无法将其转换为SQL


那么,我如何在只需构建一次映射的情况下为这两个功能用例提供服务呢?有没有什么方法可以让我用泛型来大幅减少模板上的工作量

编译映射程序供客户端使用:

#class BusinessUnitMapper
public static Func<BusinessUnit, BusinessUnitDTO> BU2DTO = EntityToMessage.Compile();

public BusinessUnitDTO Map(BusinessUnit from)
    {
        BusinessUnitDTO result = null;

        if (from != null)
        {
            result = BU2DTO(from);
        }
        return result;
    }
public BusinessUnitDTO Map(BusinessUnit from)
    {
        BusinessUnitDTO result = null;

        if (from != null)
        {
            result = new BusinessUnitDTO
            {
                Id = from.Id,
                Name = from.Name,
                Code = from.Code
            };
        }
        return result;
    }
     public static BusinessUnitDTO MapToMessage(this BusinessUnit businessUnit)
    {
        BusinessUnitMapper mapper = new BusinessUnitMapper();

        return mapper.Map(businessUnit);
    }
#class BusinessUnitMapper
public static Func<BusinessUnit, BusinessUnitDTO> BU2DTO = EntityToMessage.Compile();

public BusinessUnitDTO Map(BusinessUnit from)
    {
        BusinessUnitDTO result = null;

        if (from != null)
        {
            result = BU2DTO(from);
        }
        return result;
    }
public BusinessUnitDTO Map(BusinessUnit from) => from != null ? BU2DTO(from) : default;