Я изо всех сил пытаюсь найти лучший способ показать объединенный результат из двух несвязанных таблиц, используя linq to sql (C #). Таблицы - это EmailAlerts и TextAlerts, каждая из которых имеет имя пользователя, тип и состояние (плюс другие столбцы, которые отличаются, но для этих запросов нужны только три). Для составления отчетов мне нужно получить снимок пользователей, которые имеют активное оповещение в системе.
Примеры таблиц:
EmailAlerts
UserName Type Status
Alice 1 0
Alice 1 0
Alice 1 1
Alice 2 0
Alice 2 1
Alice 2 1
Bob 1 1
Bob 2 1
Mallory 1 1
Mallory 2 1
TextAlerts
UserName Type Status
Alice 1 1
Alice 2 0
Alice 2 1
Bob 1 0
Mallory 1 1
Mallory 2 1
Это будет помещено в CSV-файл, и окончательный результат для таблиц примера должен выглядеть следующим образом:
Username, ActiveType1Email, ActiveType2Email, ActiveType1Text, ActiveType2Text
Alice, Yes, Yes, No, Yes
Bob, No, No, Yes, No
Итак, для каждого уникального пользователя выясните, есть ли у него активное (статус = 0) электронное письмо или текстовое оповещение того или иного типа. Они могут иметь несколько предупреждений для обоих типов. Пользователи хранятся в Sitecore, поэтому нет пользовательских таблиц.
В данный момент я сначала получаю все уникальные имена пользователей, а затем перебираю каждое из них, чтобы узнать, какие у них оповещения. Это работает, но это довольно ужасно, поэтому я хотел бы найти лучшее решение. Можно ли сделать все это одним запросом? Будет ли хранимая процедура лучшим способом сделать это? Если кто-то может указать мне правильное направление, я сам смогу попытаться выяснить код, я просто не уверен, что лучше всего справиться с ним.
ОБНОВЛЕНИЕ: Вот текущий (безобразный) код:
public static List<Dictionary<string, string>> GetUserAlertsForCSV()
{
List<Dictionary<string, string>> alerts = new List<Dictionary<string, string>>();
var usernames = ((from e in db.EmailAlerts select e.UserName).Union
(from t in db.TextAlerts select t.UserName)).Distinct();
foreach (var username in usernames)
{
Dictionary<string, string> d = new Dictionary<string, string>();
d.Add("username", username);
bool hasActiveAlert = false;
var activeType1Email = (from e in db.EmailAlerts
join a in db.AlertStatusCodes on e.Status equals a.StatusCode
where e.UserName == username
&& e.Type == (int)AlertType.Type1
&& a.Description == "active"
select e).FirstOrDefault();
if (activeType1Email != null)
{
d.Add("type1email", "Yes");
hasActiveAlert = true;
}
else
{
d.Add("type1email", "No");
}
// repeat the above for activeType1Text, activeType2Email and activeType2Text
if (hasActiveAlert)
{
alerts.Add(d);
}
}
return alerts;
}
Спасибо
Annelie