Динамическое построение запроса для Azure DocumentDB

Недавно я переключился с 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();
    }
}

Прямо сейчас я использую 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();
}

Как я могу динамически создать предложение where, например Query.And(clauses), с помощью DocumentDB?

Спасибо


person jimbo    schedule 11.04.2015    source источник


Ответы (1)


Я думаю, что что-то подобное подойдет вам. Поскольку LINQ позволяет связывать предложения where (естественное И), вы можете построить запрос следующим образом:

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();
}

Примечание: вы можете пройти через отладчик, и представление ToString () покажет перевод SQL для запроса LINQ.

person Aravind Krishna R.    schedule 12.04.2015
comment
Спасибо, это работает при сравнении целых чисел, но я получаю сообщение об ошибке при таком сравнении строк или дат. неправильный синтаксис рядом с myString и константа типа System.DateTime не поддерживается. при выполнении query.AsEnumerable (). Count () - person jimbo; 12.04.2015
comment
используя IEnumerable ‹Stuff› query = client.CreateDocumentQuery ‹Stuff› (collectionLink); вместо IQueryable ‹Stuff› помогло. - person jimbo; 13.04.2015