如何在c#中用Id作为键,数据类作为值从linq查询中构建字典
本文关键字:linq 查询 字典 构建 中用 Id 数据 | 更新日期: 2023-09-27 17:50:16
我希望从wcf服务(该服务托管在服务器上)构建一个字典。
在我的应用程序中,每隔5分钟,远程用户请求服务获取此字典。这个字典将帮助我查看在键的帮助下是否有消息显示在用户屏幕上。
我想得到这个结果:
键(alert_id), value1 (alert_title, value2 (alert_text)…
一个字典与Tuple似乎是一个很好的解决方案,但我需要帮助的实现。public Dictionnary<int, Tuple<Alert>> GetAlertDataItems()
{
Dictionnary<int, Tuple<Alert>> AlertData = new Dictionnary<int, Tuple<Alert>>();
var q =
from p in db.AlertMap.Include(a=>a.AlertLog).Include(a=>a.AlertMode).Includ(a=>a.AlertPriority)
from t in db.RecipientMap
where ((p.AlertLog.AlertActive==true)&&(p.AlertID==t.AlertID)&&(DateTime.Now < p.AlertLog.AlertEndDate)
select p;
foreach (AlertMap singleAlert in q)
{...//I'm lost here
}
return AlertData;
}
警告类
[DataContract]
public class Alert
{
[DataMember]
public int AlertId {get;set;}
[DataMember]
public string AlertModeCde{get;set;}
[DataMember]
public string AlertPriorityCde {get;set;}
[DataMember]
public string AlertTitle{get;set;}
[DataMember]
public string AlertText{get;set;}
[DataMember]
public DateTime AlertStartDate {get;set;}
[DataMember]
public DateTime AlertEndDate {get;set;}
[DataMember]
public byte AlertActive {get;set;}
}
感谢您的帮助
Linq有内置的ToDictionary
方法:
var AlertData = q.ToDictionary(a => a.AlertId, a => a);
在这种情况下,返回类型应该是Dictionnary<int, Alert>
或者直接将警告标题和文本提取到Tuple中:
var AlertData = q.ToDictionary(a => a.AlertId,
a => Tuple.Create(a.AlertTitle, a.AlertText));
在这种情况下,返回类型应该是Dictionnary<int, Tuple<string, string>>
您必须迭代结果并逐个向字典添加项:
for(int i=0; i< q.Count(); i++)
{
AlertData.Add(i,new Tuple<Alert>(q[i]))
}
return AlertData;
我找到了一个解决方案:
public Dictionnary<int,Alert>GetAlertDataItems()
{
Dictionnary<int,Alert> AlertDict = new Dictionnary<int,Alert>();
List<Alert> AlertData = new List<Alert>();
var q =
from p in db.AlertMap.Include(a=>a.AlertLog).Include(a=>a.AlertMode).Includ(a=>a.AlertPriority)
from t in db.RecipientMap
where ((p.AlertLog.AlertActive==true)&&(p.AlertID==t.AlertID)&&(DateTime.Now < p.AlertLog.AlertEndDate)
select p;
foreach(AlertMap singleAlert in q)
{
Alert a = new Alert();
a.AlertId = singleAlert.AlertID;
a.AlertTitle = singleAlert.AlertLog.AlertTitle;
....
AlertData.Add(a);
}
foreach(Alert alert in AlertData)
{
if(!AlertDict.Keys.Contains(alert.AlertId))
AlertDict.Add(alert.AlertId,alert);
}
return AlertDict;
}
这不是一个完美的解决方案,因为我得到了我的alertid字段两次(一个作为键,另一个作为值),但对于测试,它是可以的。