使用LINQ的Unified SQL getter

时间:2011-05-18 07:28:35

标签: 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_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;
}

此示例无法编译。

1 个答案:

答案 0 :(得分:3)

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

Create procedure s_ProcTable
@TableName varchar(128)
as

declare @sql varchar(4000)
    select @sql = 'select count(*) from [' + @TableName + ']'
    exec (@sql)
go

再次注意动态SQL。在运行之前,您无法看到任何错误

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