我System.Linq.Dynamic.Core用来动态地将lambda表达式添加到EF中的查询中。
System.Linq.Dynamic.Core
我还希望能够通过名称选择表格。我找到了这个答案:
https://stackoverflow.com/a/28101268/657477
但是它在asp.net core 2.0中不起作用。我不能使用DbSet我必须使用DbSet<TEntity>它在错误消息中说。
DbSet
DbSet<TEntity>
我想能够做 db.GetTable("Namespace.MyTable").Where(...)
db.GetTable("Namespace.MyTable").Where(...)
我怎样才能做到这一点?
首先,您需要从名称中获取实体的类型(如果您具有类型,则直接使用它即可)。您可以为此使用反射,但是EF Core的正确方法可能是使用FindEntityType方法。
FindEntityType
一旦有了类型,问题就是如何获取相应的DbSet<T>。EF Core当前不提供Set(Type)类似于EF6的非通用方法,主要是因为没有非通用DbSet类。但是,你仍然可以得到相应DbSet<T>的IQueryable通过或者使用一些EF核心内部:
DbSet<T>
Set(Type)
IQueryable
using System; using System.Linq; using Microsoft.EntityFrameworkCore.Internal; namespace Microsoft.EntityFrameworkCore { public static partial class CustomExtensions { public static IQueryable Query(this DbContext context, string entityName) => context.Query(context.Model.FindEntityType(entityName).ClrType); public static IQueryable Query(this DbContext context, Type entityType) => (IQueryable)((IDbSetCache)context).GetOrAddSet(context.GetDependencies().SetSource, entityType); } }
或Set<T>通过反射调用通用方法:
Set<T>
using System; using System.Linq; using System.Reflection; namespace Microsoft.EntityFrameworkCore { public static partial class CustomExtensions { public static IQueryable Query(this DbContext context, string entityName) => context.Query(context.Model.FindEntityType(entityName).ClrType); static readonly MethodInfo SetMethod = typeof(DbContext).GetMethod(nameof(DbContext.Set)); public static IQueryable Query(this DbContext context, Type entityType) => (IQueryable)SetMethod.MakeGenericMethod(entityType).Invoke(context, null); } }
在这两种情况下,您都可以使用以下内容:
db.Query("Namespace.MyTable").Where(...)
要么
db.Query(typeof(MyTable)).Where(...)