动态构建Azure DocumentDB的查询

jim*_*mbo 2 c# linq azure azure-cosmosdb

我最近从MongoDB转向Azure DocumentDB,并希望通过动态构建查询来检查集合中是否存在重复文档.

这就是我用MongoDB解决查询构建的方法:

MongoCollection collection = mongoDbDatabase.GetCollection<BsonDocument>("123");
var clauses = new List<IMongoQuery>();

foreach (var currResult in Results)
{
    //add query
    clauses.Add(Query.EQ("_result", currResult));
    clauses.Add(Query.EQ("_id", myId));
}

var query = (clauses.Count > 0) ? Query.And(clauses) : null;

if (query != null)
{
    //check if we have at least one duplicate
    if (collection.FindOneAs<BsonDocument>(query) != null)
    {
        DoSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我使用LINQ来检查DocumentDB中的重复项:

var result = (from c in documentDb.CreateDocumentQuery<Results>(collection.SelfLink)
              where c.result = currResult &&
              c.id == myId
              select c).AsEnumerable();
int numResults = result.Count();
if(numResults > 0)
{
    DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

如何像Query.And(clauses)使用DocumentDB 一样动态构建where子句?

谢谢

Ara*_* R. 6

我认为这样的事情会做你想要的.由于LINQ允许where子句被链接(自然AND),因此可以按如下方式构建查询:

var result = new Stuff { A = "a", B = "b" };
IQueryable<Stuff> query = client.CreateDocumentQuery<Stuff>(collectionLink);
if (result != null)
{
    query = query.Where(s => s.A == result.A);
    query = query.Where(s => s.B == result.B);
}

int numResults = query.AsEnumerable().Count();
if (numResults > 0)
{
    // DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

注意:您可以单步执行调试器,ToString()表示将显示LINQ查询的SQL转换.