动态查询SQL Server
本文关键字:Server SQL 查询 动态 | 更新日期: 2023-09-27 17:58:21
我正在创建一个仪表板。我已经开始重构应用程序,所以与查询数据库相关的方法是通用的或动态的。
我对泛型的概念还很陌生,还是一个业余程序员,但我已经做了一些搜索,并试图想出一个解决方案。问题并不是真正以动态方式构建查询字符串。我很擅长串联字符串文字和变量,我真的不需要任何更复杂的东西。对我来说,更大的问题是当我创建这个查询时,获取数据并以动态方式将其分配给正确的变量。
比方说,我有一个缺陷表,另一个用于测试用例,另一份用于测试运行。我想创建一个看起来像的方法
public void QueryDatabase<T>(ref List<T> Entitylist, List<string> Columns, string query) where T: Defect, new()
现在这并不完美,但你明白了。并不是所有关于缺陷、测试用例和测试运行的内容都是一样的,但是,我正在寻找一种方法,将检索到的列动态分配给它的"正确"变量。
如果需要更多信息,我可以提供。
你在重新发明轮子。使用ORM,如实体框架或NHibernate。你会发现它更加灵活,像这样的工具会随着时间的推移不断发展,添加新功能并提高性能,同时你可以专注于更重要的事情。
编辑:
尽管我认为总的来说,学习使用类似工具很重要(我个人是Entity Framework的粉丝,现在已经在几个项目中成功地使用了它,在此之前还使用了LINQ to SQL),但作为一项学习练习,了解如何做到这一点仍然很有价值。我所熟悉的ORM使用XML来定义数据模型,并使用XML文件上的代码生成来创建类模型。LINQ to SQL在代码生成的类上使用自定义属性来定义每个类和属性的源表和列,并在运行时使用反射来将从SqlDataReader
返回的数据映射到类对象上的属性。实体框架的行为可能会因您使用的版本而异,无论您使用的是"默认"模板还是"POCO"模板,但最终基本上是一样的(使用反射将数据库结果映射到类上的属性),它可能只是使用自定义属性来确定映射。我想NHibernate也是这样做的。
你正在重新发明轮子,是的,这是真的。最好使用现成的对象关系映射器。但我认为您的问题也应该得到一个答案:要将查询结果动态分配给正确的属性,您需要使用反射。如果需要更多信息,请参阅System.Reflection命名空间的文档。