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

回到顶部