使用泛型类型的 C# 查询
本文关键字:查询 泛型类型 | 更新日期: 2023-09-27 18:31:23
我正在尝试创建一个通用函数来执行数据库调用(请参阅下面的代码)。我将该功能放在一个单独的解决方案中,以便我可以在不同的项目中使用它。
该行:
var data = d.Database.SqlQuery<T> (sql).First();
给我错误:
无效的对象名称"VM_MailData"
(VM_MailData是我添加为通用类型 T 的类型)
public static void ProcessData<T>(string Group, int Id)
{
string ConnectionString = "SomeConnectionStringName";
string sql = "select top 1 * from " + (typeof (T).Name) + " where " + Group + "Id = " + Id + ";";
DbContext d = new DbContext(ConnectionString);
var data = d.Database.SqlQuery<T> (sql).First();
//Do some stuff with the data...
html = "some tekst...";
foreach (var sourceProperty in data.GetType().GetProperties())
{
html = html.Replace("{#" + sourceProperty.Name + "#}", sourceProperty.GetValue(data, new object[] { }) == null ? "" : sourceProperty.GetValue(data, new object[] { }).ToString());
//enter code here
}
}
您很可能需要使用某种基本类型的VM_MailData
调用ProcessData<T>(string Group, int Id)
。我假设 VM 代表"视图模型",你有类似的东西
public class MailData
{
}
public class VM_MailData : MailData
{
}
其中 MailData 类实际上是具有相应表的类。因此,您需要拨打ProcessData<MailData>("some group", 1)
,而不是拨打ProcessData<VM_MailData >("some group", 1)
。
附言你真的应该使用参数化查询来避免SQL注入!
我可以看到你要去哪里:)所以。。。您必须创建一个从类型映射到相应表名的映射(字典)。您可以使用基于类型或表名称的某种约定来构建它。
使用这些来获取 dabatase 中的可用表和视图
SELECT SCHEMA_NAME(schema_id) as SchemaName, name as Name FROM sys.tables
SELECT SCHEMA_NAME(schema_id) as SchemaName, name as Name FROM sys.views
可以使用以下脚本获取表的主键列。
DECLARE @origin_table_name AS VARCHAR(50)
SET @origin_table_name = 'Your_table_name_goes_here'
SELECT
s.name AS TABLE_SCHEMA
, t.name AS TABLE_NAME
, c.name AS COLUMN_NAME
, k.name AS CONSTRAINT_NAME
, ic.key_ordinal AS ORDINAL_POSITION
FROM
sys.key_constraints AS k
JOIN sys.tables AS t ON t.object_id = k.parent_object_id
JOIN sys.schemas AS s ON s.schema_id = t.schema_id
JOIN sys.index_columns AS ic ON ic.object_id = t.object_id
AND ic.index_id = k.unique_index_id
JOIN sys.columns AS c ON c.object_id = t.object_id
AND c.column_id = ic.column_id
WHERE
k.type = 'PK'
AND t.name = @origin_table_name
祝你好运