我在项目中使用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
的一部分。
所以,我有一些问题。
request.Ids
是外部集合?IQueryable<T>
而非IQueryable
?Include()
实现IQueryable
方法?dynamic
并使用具体类型?System.Linq.Dynamics
的表现如何?更糟吗?