如何正确使用LINQ模型映射器?

时间:2015-08-28 09:11:50

标签: c# linq entity-framework

亲爱的stackoverflow用户,

我正在开发一个包含大量模型,存储库,实体等的大型项目......

该项目遵循MVVM模式,因此也使用了一些DTO +映射器。 我决定不使用Automapper而是手动创建映射器。 现在,DTO映射的一部分对我来说似乎很混乱,那就是如何正确使用它。

以下是架构外观的一些示例代码。 为了能够在LINQ表达式中实际使用映射器,我首先必须调用.ToEnumerable(),然后调用.ToList()。 对我来说,这似乎是一个非常糟糕的主意,因为它会为每个查询消耗更多内存?

(下面的代码已经从我的实际代码中修改,以摆脱不相关的代码)

示例代码:(在getter中,我认为我做错了)

composer update

TestMapper.cs

public class TestClass
{

        private readonly IGenericRepository<TestDbConext, int, Test> _testRepository;
        private readonly TestMapper _testMapper;

        public List<Test> TestList
         {
           get
            {
              return _testRepository.Entities.ToEnumerable().Selext(x =>  _testMapper.MapFromDataModel(x)).ToList();
             }
         }
}

IGenericRepository.cs

public class TestMapper : IModelMapper<TestDto, Test>
    {
        public TestDto MapFromDataModel(Test dataModel)
        {
            return MapFromDataModel(dataModel, new TestDto());
        }

        public TestDto MapFromDataModel(Test dataModel, TestDto viewModel)
        {
            viewModel.Id = dataModel.Id;
            viewModel.Description = dataModel.Description;
            return viewModel;
        }

        public Test MapFromViewModel(TestDto viewModel)
        {
            throw new System.NotImplementedException();
        }

        public Test MapFromViewModel(TestDto viewModel, Test dataModel)
        {
            throw new System.NotImplementedException();
        }
    }

GenericRepository.cs

public interface IGenericRepository<TContext, in TKey, TEntity>
        where TEntity : class
    {

        IQueryable<TEntity> Entities { get; }

        TEntity SingleOrDefault(Expression<Func<TEntity, bool>> predicate);

        TEntity FirstOrDefault(Expression<Func<TEntity, bool>> predicate);

        IQueryable<TEntity> Where(Expression<Func<TEntity, bool>> predicate);

    }

1 个答案:

答案 0 :(得分:1)

你不能做任何其他事情。如果需要转换从数据库中恢复的实体,并将其映射到DTO类,则需要实现原始实体以将其映射到DTO实例。

但是当你离开AutoMapper时你做了一个糟糕的选择。 AutoMapper有一个非常有趣的扩展用于EF,Queryable Extensions。使用映射器,您必须从数据库中恢复完整实体,即从所有列中获取值,以仅映射您需要的值。此扩展只需要带来所需的列。我建议你使用AutoMapper,除非你有充分的理由不这样做。