我正在创建一个通用方法来调用存储库加载方法,以从类T
定义的表中检索数据库记录,其中T
未知,直到运行时。
此外,下面的代码使用已知类型BLL.Entities.Unit但我需要更改它以使用GetData方法中显示的modelType。我不明白如何在不直接使用Unit的情况下格式化param2参数。
以下是我方法中的代码:
public JsonResult GetData(string modelTypeString)
{
Type modelType = Type.GetType(modelTypeString);
MethodInfo generic = typeof(Repository).GetMethod("Load");
MethodInfo genericLoad = generic.MakeGenericMethod(modelType);
System.Linq.Expressions.Expression<System.Func<BLL.Entities.Unit, object>>[] param2 =
new System.Linq.Expressions.Expression<System.Func<BLL.Entities.Unit, object>>[1];
var returnObjects = genericLoad.Invoke(Repository, param2);
}
这是Repository Load方法:
public IQueryable<T> Load<T>(params Expression<Func<T, object>>[] includeProperties) where T : class
{
IQueryable<T> query = entities.Set<T>();
if (includeProperties != null)
{
foreach (var includeProperty in includeProperties)
{
query = query.Include(includeProperty);
}
}
return query;
}
此代码编译并执行,但我无法对returnObjects
执行任何可查询操作。我需要做类似的事情:
returnObjects.Select(u => new UnitViewModel
{
Id = u.Id,
Name = u.Name,
Description = u.Description,
DDLocationId = u.LocationId
})
.ToList();
答案 0 :(得分:0)
使用您的存储库并使用AutoMapper映射所有对象不是您的解决方案吗?
您想要的是将您的EntityFramework对象转换为DTO。
我不知道anathing excepted能够让你在没有任何c#反射的情况下做到这一点。
编辑:我认为你的问题应该是,如何将我的EF对象变成DTO。
答案 1 :(得分:-1)
我能用一行代码解决这个问题:
returnObjects.GetEnumerator();
这会强制从数据库中检索数据。之后,只需使用额外的反射代码即可获得各个字段属性。