当前位置: 首页 > 编程语言 > C#

在EFCore2.0中动态访问表Share

时间:2023-04-10 15:19:43 C#

在EFCore2.0中动态访问表我还希望能够按名称选择表。我找到了这个答案:https://stackoverflow.com/a/28101268/657477但它不适用于asp.netcore2.0。我不能使用DbSet我必须使用它在错误消息中显示的DbSet。我希望能够执行db.GetTable("Namespace.MyTable").Where(...)我该怎么做?首先,您需要从名称中获取实体的类型(如果您有类型,直接使用它即可)。您可以使用反射,但EFCore的正确方法可能是使用FindEntityType方法。有了类型之后,问题就是如何得到对应的DbSet。EFCore目前没有提供类似DbSet的non-genericSet(Type)方法,主要是因为没有non-genericDbSet类。但是你可以通过使用一些EFCore内部结构获得相应的DbSet作为IQueryable:usingSystem;使用System.Linq;使用Microsoft.EntityFrameworkCore.Internal;命名空间Microsoft.EntityFrameworkCore{publicstaticpartialclassCustomExtensions{publicstaticIQueryableQuery(thisDbContextcontext,stringentityName)=>context.Query(context.Model.FindEntityType(entityName).ClrType);publicstaticIQueryableQuery(thisDbContextcontext,TypeentityType)=>(IQueryable)((IDbSetCache)context).GetOrAddSet(context.GetDependencies().SetSource,entityType);}}或者通过反射调使用的设置方法:usingSystem;使用System.Linq;使用System.Reflection;命名空间Microsoft.EntityFrameworkCore{publicstaticpartialclassCustomExtensions{publicstaticIQueryableQuery(thisDbContextcontext,stringentityName)=>context.Query(context.Model.FindEntityType(entityName).ClrType);staticreadonlyMethodInfoSetMethod=typeof(DbContext).GetMethod(nameof(DbContext.Set));公共静态IQueryableQuery(thisDbContextcontext,TypeentityType)=>(IQueryable)SetMethod.MakeGenericMethod(entityType).Invoke(context,null);在这两种情况下,您都可以使用以下内容:db.Query("Namespace.MyTable").Where(...)或db.Query(typeof(MyTable)).Where(...)EFCore不再具有non-generics.set方法,但是这个扩展类使得使用基于动态linq的字符串查询表变得容易成为可能().GetMethod("Set").MakeGenericMethod(t).Invoke(_context,null);}publicstaticIQueryableSet(thisDbContext_context,Stringtable){TypeTableType=_context.GetType().Assembly.GetExportedTypes().FirstOrDefault(t=>t.Name==table);IQueryableObjectContext=_context。设置(表类型字典[表]);返回对象上下文;}}}用法:以上是C#学习教程:动态访问EFCore2.0中表共享的所有内容,如果对大家有用,需要详细了解C#学习教程,希望大家多多包涵多注意它——IQueryablequery=db.Set("TableName");//过滤下面的“query”变量...Listresult=查询.ToList();//或进一步使用动态LinqIQueryablequery=db.Set("TableName").Where("t=>t.TableFilter=="MyFilter"");本文收集自网络,不代表立场,如涉及侵权,请点击右侧联系管理员删除,如需转载请注明出处: