从列表中获取与其他列表中的所有项目匹配的项目

时间:2013-11-08 19:26:48

标签: c# asp.net-mvc linq

我有两个清单:

public class KeywordAdCategory
{
    [Key]
    [Column("Ad_Id", Order = 1)]
    public int Ad_Id { get; set; }

    [Key]
    [Column("Category_Id", Order = 2)]
    public int Category_Id { get; set; }

    [Key]
    [Column("Keyword_Id", Order = 0)]
    public int Keyword_Id { get; set; }
}


public IList<int> KeywordIds { get; set;}

值:

KeywordIds = { 3510, 5686 }

KeywordAdCategory = 

     5291 | 1 | 3510
     5308 | 5 | 3510
     5310 | 5 | 3510
     5312 | 5 | 3510
     5308 | 5 | 5686

我需要从KeywordAdCategory中提取与Keyword_ID 3510和5686匹配的Ad_Id,因此我只能得到5308。

到目前为止,我有:

var matchingKac = from kac in keywordAdCategoryQuery
                  where keywordIds.Distinct().Contains(kac.Keyword_Id)
                  select kac.Ad_Id;

但是它返回了KeywordAdCategory的所有记录。

任何想法?

感谢。

1 个答案:

答案 0 :(得分:1)

我可以通过将KeywordAdCategory对象分组为匿名类型来实现此目的。

var grouped = kacList.GroupBy(x => x.Ad_Id,
                              y => y.Keyword_Id,
                              (id, keywords) => new
                              { 
                                  Ad_ID = id, 
                                  Keywords = keywords.ToList()
                              });

然后,我可以检查每个唯一的Ad_ID,看它是否与keywordIds数组中的每个关键字都匹配。

var resultsList = grouped.Where(x => keywordIds.All(y => x.Keywords.Contains(y)))
                         .ToList();