Унифицированный SQL-геттер с LINQ - PullRequest
0 голосов
/ 18 мая 2011

Я получил много разных таблиц SQL с одинаковым дизайном - у всех есть идентификаторы и два строковых поля с одинаковыми именами.Я не хочу писать набор функций для получения значений из этих таблиц, я хочу иметь одну процедуру с таблицей в качестве параметра.Но когда я начинаю получать данные, он говорит: «Не могу преобразовать тип бла-бла-бла».Нужно, чтобы тип был передан напрямую, и это то, чего я хочу избежать.Что делать?

/*
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 Ответ

3 голосов
/ 18 мая 2011

Первый шанс: вы можете использовать динамический SQL для передачи имени таблицы для каждого запроса. Но это должно быть больно, потому что вы теряете безопасный тип LINQ. Например:

Create procedure s_ProcTable
@TableName varchar(128)
as

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

Еще раз, будьте осторожны с динамическим SQL. Вы не увидите никакой ошибки, пока не запустите ее

Второй шанс: пусть ваш метод универсален. Таким образом, вам просто нужно указать тип, необходимый для каждого вызова, не нужно переписывать весь метод.

...