linq to sql (C#) を使用して、2 つの無関係なテーブルから結合された結果を表示する最善の方法を見つけるのに苦労しています。テーブルは EmailAlerts と TextAlerts で、それぞれに UserName、Type、および Status があります (その他の列は異なりますが、このクエリにはこれら 3 つだけが必要です)。レポートの目的で、システムでアクティブなアラートを持つユーザーのスナップショットを取得する必要があります。
テーブルの例:
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 に保存されるため、ユーザー テーブルはありません。
現時点では、最初にすべての一意のユーザー名を取得してから、それぞれのユーザー名をループして、どのようなアラートがあるかを調べています。動作しますが、かなりひどいので、より良い解決策を見つけたいと思います。1 つのクエリですべてを実行することは可能ですか? ストアドプロシージャはそれを行うためのより良い方法でしょうか? 誰かが私を正しい方向に向けることができれば、自分でコードを理解しようとすることができますが、それに取り組む最善の方法がわかりません。
更新:現在の(醜い)コードは次のとおりです。
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;
}
ありがとう、
アネリー