C # linq to sql - динамическое выделение таблиц - PullRequest
7 голосов
/ 24 августа 2011

У меня есть следующий сценарий: есть база данных, которая генерирует новый logTable каждый год. Это началось в 2001 году и в настоящее время имеет 11 таблиц. Все они имеют одинаковую структуру, то есть одинаковые поля, индексы, pk и т. Д.

У меня есть несколько классов, называемых менеджерами, которые, как следует из названия, управляют каждой операцией в этой БД. Для каждой отдельной таблицы у меня есть менеджер, за исключением этой таблицы, в которой у меня есть только один менеджер.

Я много читал и пробовал разные вещи, такие как использование ITable для динамического получения таблиц или интерфейс, который реализован во всех моих таблицах. К сожалению, я теряю свойства со строгим контролем типов, и с этим я не могу выполнять какие-либо поиски, обновления или что-либо еще, поскольку я не могу использовать logTable.Where(q=> q.ID == paramId).

Учитывая, что эти таблицы имеют одинаковую структуру, запрос, который ищет журналы с 2010 года, может быть именно тем, который ищет журналы с 2011 года и далее.

Я спрашиваю об этом только потому, что не хотел бы переписывать один и тот же код для каждой таблицы, поскольку они одинаковы по своей структуре.

EDIT

Я использую Linq to SQL в качестве ORM. И в этих таблицах используются все операции с БД, а не только выбор.

Ответы [ 3 ]

2 голосов
/ 24 августа 2011

Рассмотрите возможность размещения всех ваших журналов в одной таблице и используйте разбиение для поддержания производительности. Если это невозможно, вы можете создать представление, объединяющее все таблицы журнала, и использовать его при выборе данных журнала. Таким образом, когда вы добавляете новую таблицу журнала, вы просто обновляете представление, чтобы включить новую таблицу.

РЕДАКТИРОВАТЬ В дополнение к последнему комментарию:

Похоже, вам нужен новый администратор базы данных, если он не позволит вам создавать новых SP. Да, я думаю, можно определить интерфейс ILogTable, а затем заставить классы таблицы журналов реализовать его, но это не позволит вам сделать GetTable<ILogTable>(). Вы должны иметь некоторый класс DAL с методом, который создал запрос объединения, например

public IEnumerable<ILogTable> GetLogs()
{
    var Log2010 = from log in DBContext.2010Logs
                  select (ILogTable)log;
    var Log2011 = from log in DBContext.2011Logs
                  select (ILogTable)log;
    return Log2010.Concat(Log2011);
}

Приведенный выше код полностью не проверен и может ужасно потерпеть неудачу; -)

Отредактировано, чтобы сохранять @ AS-CII счастливым; -)

1 голос
/ 24 августа 2011

Возможно, вы захотите взглянуть на проект Codeplex Fluent Linq to SQL . Я никогда не использовал его, но я знаком с идеями использования подобных методов отображения в EF4. Вы можете создать один объект и динамически отобразить его на разные таблицы, используя синтаксис, такой как:

public class LogMapping : Mapping<Log> {
    public LogMapping(int year) {
        Named("Logs" + year);
        //Column mappings...
    }
}
0 голосов
/ 26 августа 2011

Пока каждый из ваших запросов возвращает одну и ту же форму, вы можете использовать ExecuteQuery («Выбрать столбцы из LogTable» + экземпляр). Просто имейте в виду, что ExecuteQuery - это один из случаев, когда LINQ to SQL допускает SQL-инъекцию. Я обсуждаю, как параметризовать ExecuteQuery на http://www.thinqlinq.com/Post.aspx/Title/Does-LINQ-to-SQL-eliminate-the-possibility-of-SQL-Injection.

...