C# Linq to SQL запрос с проекцией из варианта столбца
У меня есть код, который будет работать на многих различных системах, каждая из которых будет иметь собственное "имя" для идентификации системы и того, будут ли клиенты иметь доступ к этой системе.
Таблица "разрешений" - это устаревшая версия MySQL без внешних ключей, которая просто не совсем готова для нормализации и переписывания для MSSQL в лучшей форме. (Это более долгосрочный проект, и многие приложения должны быть сначала переписаны). Вот почему я использую явные запросы Join, а не запросы в стиле внешних ключей. Так и будет сейчас.
Основной код иллюстрирует проблему / вопрос:
using (var dc = new MySqlDataContext())
{
var queryResult = (from c in dc.Customers
join m in dc.MembershipGroups on c.MembershipGroup equals m.MembershipName
where ((c.MembershipGroup != "Demo" && c.LastActivity > DateTime.Now.AddDays(-365)) ||
(c.MembershipGroup == "Demo" && c.LastActivity > DateTime.Now.AddDays(-120) && c.Points+c.PromoPoints > 10))
select new
{
c.Username,
c.AccountPassword,
c.FirstName,
c.LastName,
c.Points,
c.PromoPoints,
c.DeleteAccount,
c.MembershipDate,
c.MembershipGroup,
c.LastActivity,
m.<variant column>
});
}
Это последняя позиция в прогнозе. Я использую проекцию, потому что эта устаревшая таблица имеет один столбец для каждой возможной системы в ферме.... всего более 200 столбцов. Мне нужен только код для извлечения столбца для системы, в которой он работает.
Например, если этот компьютер "SYSTEM_014", в таблице members_groups есть столбец "SYSTEM_014", который содержит либо "Да", либо "Нет" относительно того, имеет ли данная конкретная группа участников привилегии для использования SYSTEM_014.
Я не хочу просто "выбирать все", потому что это вернет все 200+ столбцов в группах участников для каждого из нескольких тысяч клиентов, которые вернет запрос. (И да, он должен вернуть существенное подмножество базы данных клиентов 20K+ - вот цель этой программы! [**] Отсюда и прогноз.
Как я могу написать этот запрос Linq для "псевдопараметризации" фактического имени столбца, из которого будут запрашиваться данные? Легко выполнить нормальную параметризацию по критерию "где", но я не могу найти ничего о том, как изменить столбец SOURCE запроса во время выполнения.
Любая помощь будет оценена.
** Любопытно, почему мне нужно опрашивать несколько тысяч клиентов в наборе результатов, поэтому я полагаюсь на устаревшее приложение, которое не использует базу данных для контроля доступа пользователей. Ради любви к Питу, он на самом деле хранит привилегии в реестре Windows! Поэтому я переписываю приложение, которое извлекает соответствующие записи о клиентах из нашей базы данных и анализирует набор результатов в файл.REG, который может быть выполнен для обновления реестра с обновленными разрешениями. Нет, я не могу отойти от этого единственного в своем роде стороннего приложения. Таким образом, запросите партию, запустите файл.REG, а затем запустите его, что на порядок быстрее, чем пытаться манипулировать строкой реестра в C# - как это делается сейчас, очень и очень медленно. Переход на этот формат ускорит процесс на четыре порядка, и я использую возможность заменить код ADO (где было легко объединить текстовую строку запроса на лету и затем отправить ее) более чистым кодом LINQ.