C# 使用LINQ的统一SQL getter

C# 使用LINQ的统一SQL getter,c#,.net,linq,linq-to-sql,dynamic-sql,C#,.net,Linq,Linq To Sql,Dynamic Sql,我得到了许多具有相同设计的不同SQL表,它们都具有相同名称的标识和两个字符串字段。我不想编写一组函数来从这些表中获取值,我希望有一个将表作为参数的过程。但当我开始检索数据时,它会说“不能转换类型bla-bla-bla”。它需要直接传递类型,这正是我想要避免的。怎么办 /* defined tables: create table tableA ( id int identity not null, type_code nvarchar(50) not null, type_de

我得到了许多具有相同设计的不同SQL表,它们都具有相同名称的标识和两个字符串字段。我不想编写一组函数来从这些表中获取值,我希望有一个将表作为参数的过程。但当我开始检索数据时,它会说“不能转换类型bla-bla-bla”。它需要直接传递类型,这正是我想要避免的。怎么办

/*
defined tables: 

create table tableA 
(
  id int identity not null,
  type_code nvarchar(50) not null,
  type_description nvarchar(1000) not null
)

same SQL for tableB and tableC

tableA, tableB, tableC
*/

void getAnyId( Table tbl, string codeFilter)
{
   var p=(tableA)tbl;   // HERE I GET EXCEPTION !!!
   var id = p.Where( r=> r.code == codeFilter);
   if( id.Count() != 1 )
       return null;
   return id.id;
}
另一个例子:

    public Dictionary<string,string> readDataSchemeTypes( tvbaseDataContext dc )
    {
        Dictionary<string,string> ds = new Dictionary<string,string>();

        foreach( var ast in dc.tableA)
            ds.Add( ast.type_code, ast.type_description );

        return ds;
    }
Create procedure s_ProcTable
@TableName varchar(128)
as

declare @sql varchar(4000)
    select @sql = 'select count(*) from [' + @TableName + ']'
    exec (@sql)
go
公共字典readDataSchemeTypes(tvbaseDataContext dc)
{
字典ds=新字典();
foreach(dc.表A中的var ast)
添加(ast.type\u代码、ast.type\u说明);
返回ds;
}
这是可行的,但我需要一组函数,每个表一个

public Dictionary<string, string> readAnySchemeTypes<T>(System.Data.Linq.Table<T> table) where T:System.Data.Linq.ITable
{
    Dictionary<string, string> ds = new Dictionary<string, string>();

    foreach (var ast in table)
        ds.Add(ast.type_code, ast.type_description); // type_code and type_description are not defined for type T

    return ds;
}
公共字典readanySchemeType(System.Data.Linq.Table表),其中T:System.Data.Linq.ITable
{
字典ds=新字典();
foreach(表中的var ast)
ds.Add(ast.type_-code,ast.type_-description);//类型T未定义类型_-code和类型_-description
返回ds;
}

此示例无法编译。

第一次机会:您可以使用动态SQL为每个查询传递表名。但这应该是痛苦的,因为你失去了LINQ的类型安全。 例如:

    public Dictionary<string,string> readDataSchemeTypes( tvbaseDataContext dc )
    {
        Dictionary<string,string> ds = new Dictionary<string,string>();

        foreach( var ast in dc.tableA)
            ds.Add( ast.type_code, ast.type_description );

        return ds;
    }
Create procedure s_ProcTable
@TableName varchar(128)
as

declare @sql varchar(4000)
    select @sql = 'select count(*) from [' + @TableName + ']'
    exec (@sql)
go
同样,要小心使用动态SQL。在运行之前,您无法看到任何错误


第二个机会:让你的方法通用。因此,您只需指定每个调用所需的类型,而无需重新编写整个方法

第一次机会:您可以使用动态SQL为每个查询传递表名。但这应该是痛苦的,因为你失去了LINQ的类型安全。 例如:

    public Dictionary<string,string> readDataSchemeTypes( tvbaseDataContext dc )
    {
        Dictionary<string,string> ds = new Dictionary<string,string>();

        foreach( var ast in dc.tableA)
            ds.Add( ast.type_code, ast.type_description );

        return ds;
    }
Create procedure s_ProcTable
@TableName varchar(128)
as

declare @sql varchar(4000)
    select @sql = 'select count(*) from [' + @TableName + ']'
    exec (@sql)
go
同样,要小心使用动态SQL。在运行之前,您无法看到任何错误


第二个机会:让你的方法通用。因此,您只需指定每个调用所需的类型,而无需重新编写整个方法

您能为tableA类发布代码吗?tableA/B/C类是否具有相同的基类?tableA是否为实际的CLR类型?您需要类型转换吗?您只是不能使用linq2sql,您可以通过将表转换为IEnumerable来实现,但是您将失去性能。更好的方法是为不同的表复制这个(相同的)代码,因为如果你能看到相同的代码,那么它实际上是不一样的,sql中的每个“相同”字段都不一样。添加了sql定义和另一个示例代码。你能为tableA类发布代码吗,tableA/B/C类是否有相同的基类?tableA是实际的CLR类型吗?您需要类型转换吗?您只是不能使用linq2sql,您可以通过将表转换为IEnumerable来实现,但是您将失去性能。更好的方法是为不同的表复制此(相同)代码,因为如果您可以看到相同的代码,那么它实际上是不相同的,sql中的每个“相同”字段都不相同。添加了sql定义和另一个示例代码。您可以使用动态sql为每个查询传递表名。-您可以发布示例代码来描述您的意思吗?我添加了一个示例,然后您可以使用表名作为参数调用此存储过程。或者您可以使用即席查询,而不是存储过程。只有添加,您必须添加设置为FMTONLY OFF的字符串;输入存储过程体,否则LINQ将丢失整数的返回类型。您可以使用动态SQL为每个查询传递表名。-您可以发布示例代码来描述您的意思吗?我添加了一个示例,然后您可以使用表名作为参数调用此存储过程。或者您可以使用即席查询,而不是存储过程。只有添加,您必须添加设置为FMTONLY OFF的字符串;输入到存储过程体中,否则LINQ将丢失整数的返回类型。