我很努力地找出使用linq to sql(C#)顯示兩個不相關表的組合結果的最佳方法。這些表是EmailAlerts和TextAlerts,每個表都具有用戶名,類型和狀態(加上其他列不同,但只需要這三個查詢)。出於報告目的,我需要獲取系統中具有主動警報的用戶的快照。顯示來自不相關表(LINQ到SQL)的組合結果
示例表:
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
你能告訴我們你正在努力實現的代碼嗎,也許它會給我們一個提示?這樣的目標是不明確的。 – TheBoyan 2011-03-08 19:31:21
@bojanskr - 添加了示例表格,也將linq添加到我迄今爲止的sql代碼中,但被警告,它聞起來! :) – annelie 2011-03-08 19:39:41
沒問題,我只想幫忙,不批評:) – TheBoyan 2011-03-08 19:44:10