通过Entity类名动态获取一个DbSet

2024-04-21

我正在尝试使用System.Reflections得到一个DbSet<T>动态地从它的名字。

我现在所拥有的是:

  • The DbSet name
  • The DbSet's Type存储在变量上

我在尝试使用时遇到的问题出现了dbcontext.Set<T>()方法,因为(这些是我迄今为止的尝试):

  • When I try to assign to <T> my DbSet Type, it throws me the following compilation error:

    “XXX 是一个变量,但像类型一样使用”

  • 如果我尝试同时使用Extension您将在下面的我的代码中找到这些方法(我编写这些方法是为了尝试获得IQueryable<T>),它返回一个IQueryable<object>,不幸的是,这不是我正在寻找的,因为当然,当我尝试通过进一步的反射来操作它时,它缺乏原始类所具有的所有属性......

我究竟做错了什么?我怎样才能得到一个DbSet<T>?

我的代码如下,当然,如果您需要更多信息、说明或代码片段,请告诉我。

我的控制器的方法:

public bool MyMethod (string t, int id, string jsonupdate)
{
    string _tableName = t;
    Type _type = TypeFinder.FindType(_tableName); //returns the correct type

    //FIRST TRY
    //throws error: "_type is a variable but is used like a type"
    var tableSet = _context.Set<_type>();  

    //SECOND TRY
    //returns me an IQueryable<object>, I need an IQueryable<MyType>
    var tableSet2 = _context.Set(_type);  

    //THIRD TRY
    //always returns me am IQueryable<object>, I need an IQueryable<MyType>
    var calcInstance = Activator.CreateInstance(_type);
    var _tableSet3 = _context.Set2(calcInstance);

    //...
}

Class 上下文集扩展

public static class ContextSetExtension
{ 
    public static IQueryable<object> Set(this DbContext _context, Type t)
    {
        var res= _context.GetType().GetMethod("Set").MakeGenericMethod(t).Invoke(_context, null);
        return (IQueryable<object>)res;
    }


    public static IQueryable<T>Set2<T>(this DbContext _context, T t) 
    {
        var typo = t.GetType();
        return (IQueryable<T>)_context.GetType().GetMethod("Set").MakeGenericMethod(typo).Invoke(_context, null);
    }
}

EDIT Added 类型查找器的内部代码。
简而言之,该方法的作用与Type.GetType,但在所有生成的程序集上搜索类型

public class TypeFinder
{

    public TypeFinder()
    {
    }
    public static Type FindType(string name)
    {


        Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
        var result = (from elem in (from app in assemblies
                                        select (from tip in app.GetTypes()
                                                where tip.Name == name.Trim()
                                                select tip).FirstOrDefault())
                      where elem != null
                      select elem).FirstOrDefault();

        return result;
    }
}

UPDATE根据评论中的要求,这是具体案例:

在我的数据库中,我有一些彼此非常相似的表,因此我们的想法是创建一个动态表更新方法,该方法适用于每个表,只需将表名称、行的 ID 传递给此方法要更新的数据以及包含要更新的数据的 JSON。
因此,简而言之,我将对输入中给出的 DbSet 类型的表执行一些更新,用以下命令更新行ID==id输入 JSON 中包含的数据,该数据将在 X 类型的对象(与 dbset 相同)/字典中进行解析。

在伪代码中:

public bool MyMethod (string t, int id, string jsonupdate)
{
    string _tableName = t;
    Type _type = TypeFinder.FindType(_tableName); //returns the correct type

    //THIS DOESN'T WORKS, of course, since as said above:
    //<<throws error: "_type is a variable but is used like a type">>
    var tableSet = _context.Set<_type>();  

    //parsing the JSON
    var newObj = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonupdate, _type);

    //THIS OF COURSE DOESN'T WORKS TOO
    //selecting the row to update:
    var toUpdate = tableSet.Where(x => x.Id == id).FirstOrDefault();

    if(toUpdate!=null)
    {

       var newProperties = newObj.GetType().GetProperties();
       var toUpdateProperties = toUpdate.GetType().GetProperties();

       foreach(var item in properties)
       {
           var temp = toUpdateProperties.Where(p => p.Name==item.Name)
           {
              //I write it really in briefand fast, without lots of checks.
              //I think this is enough, I hope
              temp.SetValue(toUpdate, item.GetValue());
           }
       }

       _context.SaveChanges();
    }

    return false;
}

returns me an IQueryable<object>, I need an IQueryable<MyType>

好吧,那永远行不通。您的 IQueryable 不能是类型IQueryable<MyType>因为这意味着编译器需要知道什么MyType是的,但那是不可能的,因为这个练习的重点是在运行时决定。

也许就足够了know这些对象实际上是MyType?

如果没有,我想你已经把自己逼到了一个角落,你正在想办法用什么油漆来摆脱那里。退一步来说,这可能不是技术问题。Why你需要这样做吗?为什么您有仅在运行时了解类型的冲突需求and编译时知道吗?

您需要考虑您的需求,而不是技术细节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过Entity类名动态获取一个DbSet 的相关文章

  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • ASP.NET Core Tag Helper Checkbox 不保存未选中的值

    我正在使用标签帮助程序在 MVC 表单中添加一个复选框 div class form group div
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • 如果使用 SingleOrDefault() 并在数字列表中搜索不在列表中的数字,如何返回 null?

    使用查询正数列表时SingleOrDefault 当在列表中找不到数字时 如何返回 null 或像 1 这样的自定义值 而不是类型的默认值 在本例中为 0 你可以使用 var first theIntegers Cast
  • 增加在 Azure 上运行的 Dockerized ASP.NET Core 站点的最大上传大小限制?

    以下是应用程序的架构 使用 ASP NET Core 编写的 Web API Dockerfile 使用以下命令构建 Web 应用程序microsoft dotnet 2 1 sdk并使用执行 APImicrosoft dotnet asp
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke

随机推荐

  • Linux 中允许的 c/c++ 最大互斥体数量

    我一直在尝试找出 Linux 中 c c 进程的最大互斥体数量是多少 但没有成功 另外 有没有办法修改这个数字 我正在读的书提到了如何找到Linux中允许的最大线程数以及如何修改这个数字 但没有提到互斥体 检查这个pthread mutex
  • Django Postgresql 在迁移时删除列默认值

    我面临表默认值的问题 例如我有这个模型 class model1 models Model field1 models CharField max length 50 default My Default Value 1 db column
  • 如何完全静音 bash 脚本中的 vlc 输出?

    我有一个为自己编写的脚本 它在接近结束的地方使用 vlc 我需要它停止输出它想要的任何内容 但保留我自己的输出 所以没有 清除 我使用了参数 q 和 no sout x264 quiet 但无济于事 它仍然输出丑陋的消息 即 警告 调用 r
  • 使用两个具有相同命名空间的 .NET 库

    我目前正在为一家公司维护一些旧代码 正如所发生的那样 我正在修改的当前应用程序使用旧版本的内部库 我们将其称为 Lib1 dll 他们还有一个名为 Lib2 dll 的新版本库 它在许多方面对以前的库进行了改进 不幸的是 Lib2 不向后兼
  • VBS 脚本 getElementbyID 错误(自动登录脚本)

    我正在编写适用于不同站点的 vbs 脚本文件 但我正在为我的大学网页编写用于互联网页面登录的自动登录脚本 所以我一直在工作直到填写用户名和密码 但我无法让它点击登录 这是大学登录的链接 我不确定您是否可以从网络外访问它 请注意编辑请不要将其
  • 从 DataReader 读取数据的通用方法

    我目前正在使用此方法从 DataReader 读取数据 private T GetValue
  • LinkedList“节点跳转”

    试图找出为什么我的list 类指针被第三个节点覆盖 插入函数 如下 中发生的情况是 第三次调用插入函数headByName gt nextByName当第三个节点应该指向第二个节点时 节点指针被第三个节点覆盖 因此 您可以猜测第 4 个节点
  • 使用 Velocity 生成基于 HTML 的电子邮件

    我尝试这个教程http www java2s com Code Java Velocity UseVelocitytogenerateHTMLbasedemail htm http www java2s com Code Java Velo
  • Tensorflow:加载预训练 ResNet 模型时出错

    我想使用 Tensorflow 中预先训练的 ResNet 模型 我下载了code https github com tensorflow models blob master research slim nets resnet v1 py
  • 如何在 Qt 中实现 QHoverEvent?

    我正在学习 Qt 和 C 我已经成功地实现了信号和槽来捕获标准事件 例如ButtonPushed 等等 但是 我希望当我将鼠标悬停在鼠标上并移出鼠标时调用一个函数QLabel 看起来像QHover事件 http doc qt io qt 4
  • Twisted、FTP 和“流式传输”大文件

    我正在尝试实现最能描述为 HTTP API 的 FTP 接口 的内容 本质上 有一个现有的 REST API 可用于管理站点的用户文件 并且我正在构建一个中介服务器 将该 API 重新公开为 FTP 服务器 因此 您可以使用 Filezil
  • 如何正确使用DispatchQueue.main.async?

    我的应用程序中有一个循环 可能需要几秒钟的时间来处理 我希望当循环在后台运行时屏幕立即关闭 这可能吗 我尝试过仅添加循环 DispatchQueue main async for in 1 self numberOfTransactions
  • Maven:从执行元素获取目标配置

    假设我有以下魔力 Mojo name some goal public class MyMojo Parameter required true protected ComplexObject param 另外我在 pom 中有插件的描述符
  • 如何剪辑较大的图像以适合以编程方式构建的 tabBarController 中的 tabBar 图标。

    我以编程方式创建了一个选项卡控制器 现在 我想将图像添加到不同的选项卡 为此我使用了 self tabBarItem image UIImage imageNamed Sample Image png 问题是 Sample image 的大
  • C++ 模板继承问题与基类型

    我有以下代码 但无法编译 template lt typename T gt class Base public typedef T TPtr void func template lt typename T gt class Derive
  • Nexus 工件删除命令

    我已使用以下命令从命令行将工件上传到 Sonatype Nexus MAVEN maven bin mvn X e 部署 部署文件 Durl http maven nexus com nexus content repositories x
  • 将公钥添加到 ~/.ssh/authorized_keys 不会自动登录

    我将公共 SSH 密钥添加到授权密钥 file ssh localhost应该让我登录而不询问密码 我这样做并尝试输入ssh localhost 但它仍然要求我输入密码 我还需要进行其他设置才能使其正常工作吗 我已按照更改权限的说明进行操作
  • MASM32 中令人困惑的括号

    我正在尝试掌握 MASM32 但对以下内容感到困惑 我认为括号用于间接 所以如果我有预定义的变量 data item dd 42 then mov ebx item 会将 item 的内容 即数字 42 放入 ebx 中并 mov ebx
  • 来自卸载事件的同步 AJAX 发布:如何确保用户在下一页加载时看到来自数据库的最新信息

    当用户请求编辑 CMS 中的条目时 我们会 锁定 它 以便其他人无法同时编辑它 当他们提交更改时 我们会释放锁定 然而 我们需要处理用户通过其他链接离开页面的情况 我的第一次尝试是使用 jQuery 来触发同步 ajax 呼吁 window
  • 通过Entity类名动态获取一个DbSet

    我正在尝试使用System Reflections得到一个DbSet