当编译时T未知时,如何声明IQueryable <t>

时间:2016-06-16 15:54:23

标签: c# .net generics reflection iqueryable

我正在创建一个通用方法来调用存储库加载方法,以从类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();

2 个答案:

答案 0 :(得分:0)

使用您的存储库并使用AutoMapper映射所有对象不是您的解决方案吗?

您想要的是将您的EntityFramework对象转换为DTO。

我不知道anathing excepted能够让你在没有任何c#反射的情况下做到这一点。

编辑:我认为你的问题应该是,如何将我的EF对象变成DTO。

答案 1 :(得分:-1)

我能用一行代码解决这个问题:

returnObjects.GetEnumerator();

这会强制从数据库中检索数据。之后,只需使用额外的反射代码即可获得各个字段属性。