0

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

示例数组(splitKeywords):

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

关键字搜索表:

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与数组中所有单词匹配的所有 s 。

到目前为止,我有:

编辑:

var keywordSearchQuery = _keywordSearchRepository.Query;

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

但它不起作用。有任何想法吗?

谢谢

4

2 回答 2

3

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

Original - 检查所有 Name 值是否与 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,它将匹配。

于 2013-07-16T14:47:04.167 回答
0

这将遍历您的数组并找到每个元素的匹配键,如果这是您正在寻找的?

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

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

于 2013-07-16T14:39:49.677 回答