C# 使用AutoMapper和Entity Framework更改从数据库表中获取的列
我们有一个新的需求,需要从表中动态获取列列表。我们在这个表中有141列,但是如果我们只想返回其中的2或3列,我们只是在运行时之前不知道是哪3列 这些列作为C# 使用AutoMapper和Entity Framework更改从数据库表中获取的列,c#,entity-framework-6,automapper,iqueryable,automapper-8,C#,Entity Framework 6,Automapper,Iqueryable,Automapper 8,我们有一个新的需求,需要从表中动态获取列列表。我们在这个表中有141列,但是如果我们只想返回其中的2或3列,我们只是在运行时之前不知道是哪3列 这些列作为列表传入,希望我可以使用反射来访问源对象上的属性 我们已经能够通过将TObjectDto传递到我们的服务中来支持这一点,我们的IQueryable在访问数据库之前就被投射到了服务中,它只是不处理等式的动态列部分 到目前为止,我还无法使用MapFrom做类似的事情(运气不好,因为反射在LINQ中不受支持,它必须是LINQ,否则queryable不
列表
传入,希望我可以使用反射来访问源对象上的属性
我们已经能够通过将TObjectDto
传递到我们的服务中来支持这一点,我们的IQueryable
在访问数据库之前就被投射到了服务中,它只是不处理等式的动态列部分
到目前为止,我还无法使用MapFrom做类似的事情(运气不好,因为反射在LINQ中不受支持,它必须是LINQ,否则queryable不支持它)
有什么理由让我继续钻这个兔子洞,而仅仅使用我必须的来生成一些原始SQL吗?我找到了一个我非常满意的解决方案 我声明了一个直接从模型类继承的Dto类
public class MyObjectDto : MyObject
{
}
然后像这样配置自动映射配置文件
CreateMap<MyObject, MyObjectDto>()
.ForAllMembers(s => s.ExplicitExpansion());
CreateMap()
.ForAllMembers(s=>s.ExplicitExpansion());
然后我整理了我想要检索的字段列表,并
result = await myObjects
.ProjectTo<TMyObjectDto>(_mapperConfiguration, null, fieldsToRetrieve.ToArray())
.ToListAsync().ConfigureAwait(false);
result=wait myObjects
.ProjectTo(_-mapperConfiguration,null,fieldstoretrive.ToArray())
.ToListSync().ConfigureAwait(false);
然后,这只查询数据库值以查找fieldstoretrive
中的属性,其余为空/默认值,非常适合我的需要
感谢Lucian在评论中为我指出了正确的方向在我看来,您的数据库设计对于此应用程序来说是错误的。我没有异议,这在某种程度上是我们应用程序的核心,并且非常庞大(在列和数据中),您需要80个不同的查询,您需要通过字符串进行选择(列名或其他最好的名称)。字典之类的东西怎么样?