使用泛型类型的 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
   }
}

使用泛型类型的 C# 查询

您很可能需要使用某种基本类型的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 

祝你好运