C#查询使用泛型类型

时间:2016-01-22 11:17:06

标签: c# asp.net-mvc

我正在尝试创建一个通用函数来进行数据库调用(参见下面的代码)。我已将该功能放在一个单独的解决方案中,以便我可以在不同的项目中使用它。

行:

Permission denied

给我错误:

  

无效的对象名称' VM_MailData'

(VM_MailData是我添加为通用类型T的类型)

var data =  d.Database.SqlQuery<T> (sql).First(); 

2 个答案:

答案 0 :(得分:1)

您可能需要使用某种基本类型ProcessData<T>(string Group, int Id)来呼叫VM_MailData。我假设VM代表“视图模型”,你有类似

的东西
public class MailData
{
} 

public class VM_MailData : MailData
{
}

其中MailData类实际上是具有相应表的类。 因此,您无需致电ProcessData<VM_MailData >("some group", 1),而是需要致电ProcessData<MailData>("some group", 1)

<强> P.S。你真的应该使用参数化查询来避免SQL注入!

答案 1 :(得分:0)

我可以看到你要去哪里:)所以...... 您必须创建一个从Type映射到适当的表名称的映射(字典)。您可以根据类型名称或表格使用某种约定来构建它。

使用这些来获取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 
祝你好运