我需要使用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;
但它不起作用。有什么想法吗?
由于
答案 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();
如果名称不是唯一的,或者您不确定是否匹配,则必须进行更多验证。