我有点小问题,我似乎不明白。
我有一个代码:
SELECT sr.RuleId, s.Id, s.Name FROM Sites s
INNER JOIN NotificationSiteRules sr ON s.Id = sr.SiteID
WHERE sr.RuleId IN (
SELECT r.Id FROM NotificationRules r
INNER JOIN NotificationSiteRules sr ON r.Id = sr.RuleId
WHERE r.IsDeleted = 0 AND (@siteId IS NULL OR sr.SiteId = @siteId)
)它返回以下集合:
1 1 SiteOne
3 1 SiteOne
7 1 SiteOne
1 5 SiteTwo如您所见,对于规则1,我有SiteOne和SiteTwo。必须允许这样做。
NotificationRule对象的定义是:
public class NotificationRule
{
public NotificationRule()
{
Sites = new List<Site>();
Recipients = new List<Recipient>();
}
public int? Id { get; set; }
public string Name { get; set; }
public List<Site> Sites { get; set; }
public List<Recipient> Recipients { get; set; }
}因此,在这个定义中,它实际上是说,根据每个Id,我应该能够有一个网站列表.但我得到了
System.ArgumentException: An item with the same key has already been added.当我这么做
var rules = results.Read<NotificationRule>().ToDictionary(rule => rule.Id);我做错了什么?
对不起,我正在编辑这个问题,因为我不清楚我想要达到什么目的。
我希望的最终结果是这种形式:
{1, [1,5],[SiteOne, SiteTwo]}它对应于:
{Key, List<Recipient>, list<Site>}正如您所看到的,在这个构造中,我不会有两个键,因为所有的键都在同一个元素中。
发布于 2017-02-13 10:07:55
实际上,我刚刚发现问题不在那小部分代码中,而是处理好了。问题是@siteId是空的,然后在前面的查询中得到重复的。我要结束这个问题,因为这个问题现在还没有定论;我需要找到一种方法来修复以前的查询,以获得正确的值……或者一种处理空值的方法。谢谢大家的帮助!
发布于 2017-02-09 16:19:20
听起来你可能想做一个小组,而不是创建一本字典。
var rules = results.Read<NotificationRule>().GroupBy(k => rule.Id);这将按rule.Id对规则进行分组
或者,如果您只是想获得特定规则的站点,则可以执行var siteId = 1; var sites = results.Read<NotificationRule>().Where(r => r.Id == siteId);。
发布于 2017-02-09 16:19:34
只要集合results中的对象在字段中没有唯一值,Id,您就必须在将其放入字典之前对结果进行分组。
results.Read<NotificationRule>()
.GroupBy(rule=>rule.Id).ToDictionary(group => group.Key, group=>group.ToArray());https://stackoverflow.com/questions/42141436
复制相似问题