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
}
Это то, что я пробовал раньше, но когда я пытаюсь применить к указанному выше запросу, я просто получаю ошибки времени выполнения. Я сделал .SelectMany (p => p.Filters.Where (f => ids.Contains (f.Id)). Выберите (f => p) или я также попытался с новым, но в любом случае он говорит, что он может 't cast filter to post – John
Поставщик DocumentDB LINQ не поддерживает динамические объекты. Используете ли вы 'CreateDocumentQuery' с запросом LINQ? Если это так, вам нужно будет использовать грамматику SQL. Если нет, можете ли вы разместите свой код linq для воспроизведения? –
Я не использую динамический. Я напишу свой полный код в своем исходном вопросе. – John