使用lambda函数过滤掉重复(基于选定列)查询结果

时间:2016-12-14 15:41:01

标签: c# mysql lambda

我有一个查询,返回一组包含campaignIds,PublisherIds,creationDate等的行。我想删除所有具有相同campaignId和PublisherId的行,并检索第一个creationDate(简化示例)。

执行groupBy将只显示campaignIds和publisherIds,或者如果我包含creationDate,它将不会过滤掉任何内容,因为creationDates都不同,

我能用SQL编写的最好的是:

SELECT activityType, uniqueUserId, publisherId, campaignId, nodeID
FROM
    (
    SELECT activityType , count(Id) EventCount, uniqueUserId, campaignId, publisherId, nodeID , creationDate
    FROM Eventlog 
    WHERE campaignId IN (1687,5872,1819) AND activityType = 'Load'
    GROUP BY activityType, uniqueUserId, publisherId, campaignId, nodeID, creationDate
    ) AS sub

GROUP BY activityType, uniqueUserId, publisherId, campaignId, nodeID

但是这不会显示creationDate,因为它不包含在

组中

简而言之:我想删除所有具有相同camapignId和publisherId组合以及其他条件的行。我想以lambda的形式出现这个。

我目前的lambda函数是:

var test = eventsTotal.GroupBy(x => new { x.CampaignId, x.PublisherId, x.NodeId, x.UniqueUserId });

但这并没有给我创造我需要的日期 Atm我认为唯一的方法似乎是将它排序为一个列表,并将每个项目与所有其他项目进行比较,以查看它是否重复 任何帮助表示赞赏

1 个答案:

答案 0 :(得分:0)

我认为您的问题是您的外部选择语句缺少creationDate。这意味着creationDate不会出现在从数据库发送到应用程序的结果集中。

解决方案

SELECT activityType, uniqueUserId, publisherId, campaignId, nodeID, MIN(creationDate) --I added creationDate here.
FROM
    (
    SELECT activityType , count(Id) EventCount, uniqueUserId, campaignId, publisherId, nodeID , creationDate
    FROM Eventlog 
    WHERE campaignId IN (1687,5872,1819) AND activityType = 'Load'
    GROUP BY activityType, uniqueUserId, publisherId, campaignId, nodeID, creationDate
    ) AS sub

GROUP BY activityType, uniqueUserId, publisherId, campaignId, nodeID