c# – 使用类名查询上下文仅在运行时知道
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 使用类名查询上下文仅在运行时知道,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3217字,纯文字阅读大概需要5分钟。
内容图文
![c# – 使用类名查询上下文仅在运行时知道](/upload/InfoBanner/zyjiaocheng/827/60a7d18e21b144d4a2fcd413a8ac742a.jpg)
我正在寻找创建一段代码,以允许我根据字符串类名称动态查询我的数据库.
我想要的简要概述:
我的背景:
public class MyContext : DbContext
{
public DbSet<Foo> Foos {get;set;}
public DbSet<Bar> Bars {get;set;}
}
有了我的设置,我通过做基本的context.Foos.Where(…)查询这个上下文,我基本上也想做同样的事情,但不必在编译时知道.Foos部分,喜欢它在运行时完成.
逻辑上我想要的是:
var results = context."ClassName".Where(...)
我尝试使用通用方法执行此操作,例如:
//method in context
public IEnumerable<T> GetGenericData<T>() where T : Type
{
return context.Set<T>();
}
//call in repo
context.GetGenericData<Type.GetType("Foo")>();
我不确定我是否会走这条路.理想情况下,我希望得到一个解决方案,这意味着我不必沿着SQL路线前进
编辑:
我正在进一步努力,我已经到了这一步.
//method in context
public DbSet GetGenericData(Type _type)
{
return context.Set(_type);
}
//calling like
var data = context.GetGenericData(myType);
现在的问题是var数据是DbSet.我需要能够将其转换为在运行时定义的Type列表.有没有一个简单的解决方案来做到这一点,因为我不能简单地做var data = context.GetGenericData(myType).toList()
EDIT2:
为了向问题添加更多上下文,我正在研究创建一段代码来从文件中读取数据库表的列表,例如,获取这些表中的数据并将其序列化为XML文件.
基本上我会有一个包含以下内容的文件:
Foo
Bar
MoreStuff
然后将读取哪个,并将Foo表中的所有数据导出到名为Foo.xml的xml文件中.还必须反过来,它从xml文件中读取数据并将其导入数据库
解决方法:
如果您在运行时不知道实体类型但具有类型名称,则可以在反射Type.GetType(字符串typeName)的帮助下获取名称类型,并使用DbContext.Set重载,如 – > DbSet Set.Set(类型类型)
更多细节在http://msdn.microsoft.com/en-us/library/gg679544(v=vs.113).aspx
更新:
void Main()
{
var typeMapping = new Dictionary<Type, Func<object, dynamic>>(){
{typeof(A), a => (A)a}
};
var array = new[]{new A(){ o = new Object() },new A(){ o = new Object() },new A(){ o = new Object() },new A(){ o = new Object() },};
var objectArray = array.OfType<object>();
objectArray.Select(a => typeMapping[a.GetType()](a)).Dump();
}
class A{
public object o {get;set;}
}
这是来自LinqPad的样本.你的问题是关于动态编程,我无法理解目的但仍然如此.在此粘贴中,您必须为所有实体类型定义类型映射,例如CLR类型和转换操作,它们返回所需类型的引用.例如,数组变量是目的,objectArray是您的数据.
UPADATE2:
使用SerializableAttribute标记您的实体类型
http://msdn.microsoft.com/en-us/library/system.serializableattribute(v=vs.110).aspx
比调用ToList或ToArray扩展名一样
var data = context.GetGenericData(myType).Tolist();
并使用XmlSerializer序列化它
var fileStream = File.OpenWrite("someFilePathName");
new XmlSerializer().Serialize(fileStream, data);
而已!它会起作用,因为CLR会确切知道DbSet集合中的项目类型.你不需要施展任何东西.然后XmlSerializer将完成序列化器收集实体所需的所有工作,并将其写入流,即文件流.还有一件事是添加一些检查并为IDisposable实例添加使用块.
UPDATE3:
DbSet无法转换为与ToList完全类型,因为这个想法是避免在实体的编译时使用类型.所以这里是加载数据并将其转换为对象以继续操作的想法
Set(typeof(TableBase)).Load();
var collectionToExport = Set(typeof (TableBase)).Local.Cast<object>().ToList();
和所有在一起:
var type = Type.GetType("Foo");
context.Set(type).Load();
var collectionToExport = context.Set(type).Local.Cast<object>().ToList();
var fileStream = File.OpenWrite("someFilePathName");
new XmlSerializer().Serialize(fileStream, data);
内容总结
以上是互联网集市为您收集整理的c# – 使用类名查询上下文仅在运行时知道全部内容,希望文章能够帮你解决c# – 使用类名查询上下文仅在运行时知道所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。