RavenDB Collection“in”集合查询

时间:2014-08-27 19:21:39

标签: c# ravendb

我需要预先形成一个查询,检查一个集合是否在给定集合中,就像常规操作一样,但是对于集合。

class Post
{
    public string[] Tags {get;set;}
}


session.Queury<Post>.Where(x=>x.Tags.in(new[]{".net","c#","RavenDB"})).ToList();

所以,如果我在我的数据库中:

  new Post{Tags= new[]{"C#",".net"}};

将被退回

但如果我有:

  new Post{Tags= new[]{"C#",".net","SQLServer"}};

它不会被退回。

更新

我想做的是:

  session.Query<Post>()
  .Where(x => x.Tags.All(y => y.In(new[] { "C#", ".net", "RavenDB" })))
  .ToList();

但我收到了System.NotSupportedException。

2 个答案:

答案 0 :(得分:1)

我设法找到解决方案:

static void Main(string[] args)
{
    var sessionStore = new EmbeddableDocumentStore
    {
        RunInMemory = true,
        UseEmbeddedHttpServer = true,
        Conventions =
        {
            DefaultQueryingConsistency = ConsistencyOptions.AlwaysWaitForNonStaleResultsAsOfLastWrite
        }
    };

    sessionStore.Initialize();

    using (var session = sessionStore.OpenSession())
    {
        var allTags = new[] {"C#", ".net", "RavenDB", "Linux", "Mac"};
        var tagsCollection = new[] {"C#", ".net", "RavenDB"};

        var complementTagsCollection = allTags.Except(tagsCollection).ToList();

        session.Store(new Post
        {
            Tags = new List<string>{"C#",".net"}
        });

        session.SaveChanges();

        // Posts where all their tags are in tagsCollection
        var result = session.Query<Post>().Where(x => !x.Tags.In(complementTagsCollection)).ToList();
    }
}

答案 1 :(得分:0)

IN的工作方式,它与任何一个匹配。 如果你想匹配所有你必须单独检查每个。