i'm running dotnet core , accessing documentdb.
when try run query using linq clause returns takes long time , doesn't seem filter on server. able resolve using sqlqueryspec run query , appears run query criteria on server.
is known issue or missing something?
the 1 doesn't work:
var query = _client.createdocumentquery<t>(documentcollection.documentslink).where(criteria); return query.tolist();
criteria of type
func<t, bool> criteria
the 1 work:
var documentquery = _client.createdocumentquery<t>(urifactory.createdocumentcollectionuri(_databasename, collectionname), query).asdocumentquery(); list<t> results = new list<t>(); while (documentquery.hasmoreresults) { results.addrange(await documentquery.executenextasync<t>()); } return results;
query of type
sqlqueryspec query
is feature lagging behind in dotnet core's implementation of documentdb sdk vs standard .net package?
the issue using func<t, bool>
criteria. 1 you're using ienumerable
. design ienumerable
in-memory filtering (client-side).
createdocumentquery.where()
returns iqueryable
. need change criteria type expression<func<t, bool>>
as expected createdocumentquery
.
when use expression
, linq expression converted database specific sql query , executed on server.
uri documentcollectionuri = urifactory.createdocumentcollectionuri(databaseid, collectionid); var query = client.createdocumentquery<t>(documentcollectionuri) .where(predicate) .asdocumentquery(); list<t> results = new list<t>(); while (documentquery.hasmoreresults) { results.addrange(await documentquery.executenextasync<t>()); } return results;
where predicate
expression<func<t, bool>>
one important thing remember: can use linq extentions have equivalent function in documentdb's sql language. example, can use take()
cannot use skip()
, cannot use array contains on specific nested fields, etc.
Comments
Post a Comment