我得到了许多具有相同设计的不同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;
}
这有效,但我需要一组函数,每个表一个。
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;
}
此示例不编译。
第一次机会:可以使用动态 SQL 为每个查询传递表名。但这应该是痛苦的,因为您丢失了 LINQ 的类型安全。例如:
Create procedure s_ProcTable
@TableName varchar(128)
as
declare @sql varchar(4000)
select @sql = 'select count(*) from [' + @TableName + ']'
exec (@sql)
go
再一次,要小心动态SQL。在运行它之前,您看不到任何错误
第二次机会:让你的方法通用。因此,您只需指定每个调用所需的类型,而不必重写整个方法。