代码之家  ›  专栏  ›  技术社区  ›  KallDrexx

如何检索使用LINQ中提供的所有标记标记的项目?

  •  1
  • KallDrexx  · 技术社区  · 16 年前

    这件事我好像有点不对劲。我有一个ID为的任务表和一个标记表,它有一个标记字段和一个对任务表的外键约束。

    我希望能够按标签执行和搜索任务。例如,如果我搜索带有“可移植性”和“测试”标签的任务,我不希望带有“可移植性”而不是“测试”标签的任务。

    我尝试了以下语法:

     var tasks = (from t in _context.KnowledgeBaseTasks
                         where t.KnowledgeBaseTaskTags.Any(x => tags.Contains(x.tag))
                         select KnowledgeBaseTaskViewModel.ConvertFromEntity(t)
                        ).ToList();
    

    当然,这是一个或搜索,而不是一个和搜索。我不知道如何把它转换成一个和搜索。

    编辑 我还需要能够搜索一个任务包含的X个标记中的2个。因此,如果任务被标记为“bugfix”、“portability”、“testing”,并且我搜索“testing”和“portability”,那么该任务仍然会出现。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    你想做什么 this

    linqtosql可能看起来像:

    List<int> myTags = GetTagIds();
    int tagCount = myTags.Count;
    
    IQueryable<int> subquery =
      from tag in myDC.Tags
      where myTags.Contains(tag.TagId)
      group tag.TagId by tag.ContentId into g
      where g.Distinct().Count() == tagCount
      select g.Key;
    
    IQueryable<Content> query = myDC.Contents
      .Where(c => subQuery.Contains(c.ContentId));
    

    我还没有测试过这个,明显的一点可能有点偏离。检查生成的SQL以确保。

        2
  •  3
  •   driis    16 年前

    使用all而不是any;为了只选择知识库任务,它具有 tags (但可能更多);颠倒表达:

    var tasks = (from t in _context.KnowledgeBaseTasks
                     where tags.All(tag => t.KnowledgeBaseTaskTags.Contains(tag))
                     select KnowledgeBaseTaskViewModel.ConvertFromEntity(t)
                    ).ToList();