EF Core 2.0中的动态访问表
我System.Linq.Dynamic.Core
用来动态地将lambda表达式添加到EF中的查询中。
我还希望能够通过名称选择表格。我找到了这个答案:
https://stackoverflow.com/a/28101268/657477
但是它在asp.net core 2.0中不起作用。我不能使用DbSet
我必须使用DbSet<TEntity>
它在错误消息中说。
我想能够做 db.GetTable("Namespace.MyTable").Where(...)
我怎样才能做到这一点?
回答:
首先,您需要从名称中获取实体的类型(如果您具有类型,则直接使用它即可)。您可以为此使用反射,但是EF
Core的正确方法可能是使用FindEntityType
方法。
一旦有了类型,问题就是如何获取相应的DbSet<T>
。EF
Core当前不提供Set(Type)
类似于EF6的非通用方法,主要是因为没有非通用DbSet
类。但是,你仍然可以得到相应DbSet<T>
的IQueryable
通过或者使用一些EF核心内部:
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>
通过反射调用通用方法:
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(...)
以上是 EF Core 2.0中的动态访问表 的全部内容, 来源链接: utcz.com/qa/432968.html