2015-09-16 3 views
2

LINQ Я пытаюсь выполнить следующий запрос на DocumentDb с LINQdocumentdb присоединиться

SELECT p.id 
FROM p JOIN filter IN p.Filters 
WHERE filter.Id = "686e4c9c-f1ab-40ce-8472-cc5d63597263" 
OR filter.Id = "caa2c2a0-cc5b-42e3-9943-dcda776bdc20" 

Мой JSON, как это

{ 
    "id": "a3dc570b-26e2-40a9-8777-683186965f78", 
    "Filters": [ 
    { 
     "Id": "686e4c9c-f1ab-40ce-8472-cc5d63597263" 
    }, 
    { 
     "Id": "caa2c2a0-cc5b-42e3-9943-dcda776bdc20" 
    } 
    ] 
} 

я обнаружил, что я должен использовать SelectMany делать соединение, но я не могу заставить его работать, я пробовал разные вещи, но всегда получаю ошибки во время выполнения.

редактировать: Вот запрос я пробовал, это дает «Указанный аргумент был вне диапазона допустимого имени values.Parameter: Неожиданное Sql Скалярного выражения рода преобразование»

public void TryOutQuery(IEnumerable<string> ids) 
    { 
     var options = new FeedOptions { MaxItemCount = 10, RequestContinuation = "" }; 
     var queryable = _client.CreateDocumentQuery<PostModel>(UriFactory.CreateCollectionUri(_collectionConn.DatabaseName, _collectionConn.CollectionName), options)     
      .SelectMany(p => p.Filters 
      .Where(f => ids.Contains(f.Id)) 
      .Select(f => p) 
      .Where(post => post.Status == PostStatus.Published) 
      ) 
      ; 
     var query = queryable.AsDocumentQuery(); 
     var asyn = query.ExecuteNextAsync<PostModel>(); 
     var result = asyn.Result; 
    } 

Я также попытался в другой порядок, который дает «несовместимые тип для вывода запроса типа: Post.PostModel и Post.Filter»

public void TryOutQuery(IEnumerable<string> ids) 
    { 
     var options = new FeedOptions { MaxItemCount = 10, RequestContinuation = "" }; 
     var queryable = _client.CreateDocumentQuery<PostModel>(UriFactory.CreateCollectionUri(_collectionConn.DatabaseName, _collectionConn.CollectionName), options) 
      .Where(p => p.Status == PostStatus.Published) 
      .SelectMany(p => p.Filters 
      .Where(f => ids.Contains(f.Id)) 
      .Select(f => p)     
      ) 
      ; 
     var query = queryable.AsDocumentQuery(); 
     var asyn = query.ExecuteNextAsync<PostModel>(); 
     var result = asyn.Result; 
    } 

Вот мои модели

public class Filter 
{ 
    public Filter(string id) 
    { 
     Id = id; 
    }  
    public String Id { get; set; } 
} 

public class PostModel 
{  
    public PostModel() 
    { 
     _filters = new List<Filter>(); 
    } 
    [JsonProperty("id")] 
    public String Id { get; set; } 
    //Since DocumentDb doesn't work properly with IList 
    public IEnumerable<Filter> Filters { get { return _filters; } } 
    private IList<Filter> _filters; 
    public PostStatus Status { get; set; } 

    public void AddFilter(string filterId) 
    { 
     _filters.Add(new Filter(filterId)); 
    } 

} 

public enum PostStatus 
{ 
    Draft, 
    Published, 
    Deleted 
} 

ответ

1

Я буду использовать запрос ж/два соединения и фильтр в качестве примера:

// SQL 
var familiesChildrenAndPets = client.CreateDocumentQuery<dynamic>(collectionLink, 
     "SELECT f.id as family, c.FirstName AS child, p.GivenName AS pet " + 
     "FROM Families f " + 
     "JOIN c IN f.Children " + 
     "JOIN p IN c.Pets " + 
     "WHERE p.GivenName = 'Fluffy'"); 

// LINQ 
var familiesChildrenAndPets = client.CreateDocumentQuery<Family>(collectionLink) 
     .SelectMany(family => family.Children 
     .SelectMany(child => child.Pets 
     .Where(pet => pet.GivenName == "Fluffy") 
     .Select(pet => new 
     { 
      family = family.Id, 
      child = child.FirstName, 
      pet = pet.GivenName 
     } 
     ))); 

Заканчивать этот DocumentDB Github репо более examples.

+0

Это то, что я пробовал раньше, но когда я пытаюсь применить к указанному выше запросу, я просто получаю ошибки времени выполнения. Я сделал .SelectMany (p => p.Filters.Where (f => ids.Contains (f.Id)). Выберите (f => p) или я также попытался с новым, но в любом случае он говорит, что он может 't cast filter to post – John

+0

Поставщик DocumentDB LINQ не поддерживает динамические объекты. Используете ли вы 'CreateDocumentQuery ' с запросом LINQ? Если это так, вам нужно будет использовать грамматику SQL. Если нет, можете ли вы разместите свой код linq для воспроизведения? –

+0

Я не использую динамический. Я напишу свой полный код в своем исходном вопросе. – John