1

我有两个清单:

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 中的所有记录。

有什么想法吗?

谢谢。

4

1 回答 1

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();
于 2013-11-08T19:44:46.563 回答