Linq Query返回与数组中所有单词匹配的行

时间:2013-07-16 14:35:47

标签: c# asp.net-mvc linq

我需要使用linq构建一个查询来返回与数组中所有单词匹配的行:

示例数组(splitKeywords):

{string[2]}
    [0]: "RENAULT"
    [1]: "CLIO"

KeywordSearch表:

public class KeywordSearch
{
    // Primary properties
    public int Id { get; set; }
    public string Name { get; set; }
    public Keyword Keyword { get; set; }
}

此表包含记录:

Id: 1
Name: "RENAULT"
Keyword_Id: 3503

Id: 2
Name: "CLIO"
Keyword_Id: 3503

我希望获得匹配数组中所有单词的所有Keyword_Id

到目前为止,我有:

编辑:

var keywordSearchQuery = _keywordSearchRepository.Query;

var keywordIds = from k in keywordSearchQuery
                        where splitKeywords.All(word => word.Equals((k.Name)))
                        select k.Keyword.Id;

但它不起作用。有什么想法吗?

由于

2 个答案:

答案 0 :(得分:3)

首先,您需要将具有相同Keyword.Id的所有记录组合到单个记录中。用GroupBy做到这一点 将它们分组后,您可以过滤出组(KeywordIds),其中所有项目(单个记录,名称)与至少一个splitKeyWords不匹配。

原始 - 这会检查所有名称值是否与splitKeyWords中的值匹配

var results = keywordSearchQuery
                .GroupBy(k => k.Keyword_Id)
                .Where(g => g.All(k => splitKeyWords.Any(w => w.Equals(k.Name))))
                .Select(g => g.Key);

已更新 - 这会检查splitKeyWords中的所有值是否与名称匹配。

var results = keywordSearchQuery
                .GroupBy(k => k.Keyword_Id)
                .Where(g => splitKeyWords.All(w => g.Any(k => w.Equals(k.Name))))
                .Select(g => g.Key);

请注意,如果您有一个名为RENAULT,CLIO和ASDF的Keyword.Id,它将匹配。

答案 1 :(得分:0)

这将通过你的数组并找到每个元素的匹配键,如果这是你正在寻找的那个?

var ids splitKeywords.Select(k => keywordSearchQuery.Single(q => q.Name == k).Id).ToArray();

如果名称不是唯一的,或者您不确定是否匹配,则必须进行更多验证。