如何在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;}
    }

感谢您的帮助

如何在c#中用Id作为键,数据类作为值从linq查询中构建字典

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字段两次(一个作为键,另一个作为值),但对于测试,它是可以的。