查找集合中具有子集合中列表中任何字符串的对象

时间:2015-08-05 18:43:49

标签: c# linq telerik-open-access

好的,这个让我难过。

我有一组名为Interviews的对象。面试中有一系列笔记。注意具有名为NoteText的字符串(数据库上的nvarchar(max))属性。

我有一个名为关键字的列表。

我需要做的是找到所有注释,其NoteText属性中包含任何关键字。

到目前为止,我有这个:

var interviewQuery =
from i in dbContext.Interviews  //dbContext was created with Telerik OpenAccess
    .Include(n => n.Notes)
    .Where(i => i.Notes.Any(n => keywords.Contains(n.NoteText) ))
orderby i.WhenCreated descending
select i;

我没有收到错误,我也没有得到任何结果。

2 个答案:

答案 0 :(得分:0)

我在linq上很差,但这可以通过循环轻松完成。

var matchinginterviews = new List<Interview>();
foreach (var inter in MyInterviewEnumerable)
{
    foreach (var note in inter.NoteCollection)
    {
        foreach (string keyword in keywordList)
        {
            if (note.NoteText.IndexOf(keyword) != -1)
            {
                matchinginterviews.Add(inter);
            }
        }
    }
}

答案 1 :(得分:0)

导致空结果的原因是您正在查找包含任何笔记的全部内容的任何关键字值。

我们制作了一个扩展方法ContainsAny:

public static bool ContainsAny(this string s, IEnumerable<string> possibleContained)
{
    foreach (string p in possibleContained)
    {
        if (s == p) return true;
        if (s == null) continue;
        if (s.Contains(p)) return true;
    }

    return false;
}

然后你可以做一些类似于你开始的地方:

var results = dbContext.Interviews.Where(i => i.Notes.Any(n => n.NoteText.ContainsAny(keywords)));