创建请求的概括

时间:2019-11-09 16:37:52

标签: c# .net-core entity-framework-core

我在项目中使用EF Core 3.0,现在尝试实现自己的概括。

public class DatabaseQueryObject
{
    public string DbName { get; set; }
    public ICollection<string> Tables { get; set; }
    public Type RequestedDataType { get; set; }
    public string? Filter { get; set; }
    public object[] FilterParams { get; set; }

    public ICollection<Guid> Ids { get; set; }
}

public async Task<List<dynamic>> GetCustomTableElemById(DatabaseQueryObject request)
{
    var query = dbContext.Query(request.DbName);
    var requestedQuery = query.Where("e => request.Ids.Contains(e.Id)");
    var filteredQuery = request.Filter != null ? requestedQuery.Where(request.Filter, request.FilterParams) : requestedQuery;
    var executedQuery = await filteredQuery.ToDynamicListAsync();

    return resultObjectCreator.Create(result: request.Ids.Count > 0 ? executedQuery : executedQuery.FirstOrDefault() as object);
}

此处dbContext-相同的DbContext派生的EF Core上下文。

public static class DbContextExtensions
{
    public static IQueryable Query(this DbContext context, string entityName)//, [Optional]T dataType)
    {
        var entityType = context.Model.GetEntityTypes().FirstOrDefault(f => f.ShortName() == entityName);
        var result = (IQueryable)context.Query(entityType.ClrType);//context.Model.FindEntityType(entityName).ClrType);

        return result;
    }

    static readonly MethodInfo SetMethod = typeof(DbContext).GetMethod(nameof(DbContext.Set));

    public static IQueryable Query(this DbContext context, [Optional] Type entityType)
    {
        return SetMethod.MakeGenericMethod(entityType).Invoke(context, null) as IQueryable;
    }
}

但是此代码返回IQueryable,而无法返回需要与IQueryable<T>一起使用的Include()(如果我想包括子表)。 另外,我在代码部分var requestedQuery = query.Where("e => request.Ids.Contains(e.Id)");上遇到运行时错误,因为request.Ids不是DbSet<SameClass>中定义的dbContext的一部分。

所以,我有一些问题。

  1. 如何说EF Core request.Ids是外部集合?
  2. 如何实现IQueryable<T>而非IQueryable
  3. 如何通过Include()实现IQueryable方法?
  4. 如何在此代码中放弃使用dynamic并使用具体类型?
  5. System.Linq.Dynamics的表现如何?更糟吗?

0 个答案:

没有答案