-
Notifications
You must be signed in to change notification settings - Fork 32
Closed
Labels
bugSomething isn't workingSomething isn't working
Description
When I use Database Splitting, linq method FirstOrDefault without predicate doesn't apply Where clause.
No problem with FirstOrDefault with predicate or ToList (return generic data).
No problem without database splitting.
public class CouchDBContext : CouchContext
{
public CouchDatabase<ExampleDataCouchDB> ExampleDatas { get; set; }
public CouchDatabase<DesignDocument> Design { get; set; }
public CouchDBContext(CouchOptions<CouchDBContext> options)
: base(options) {}
protected override void OnDatabaseCreating(CouchDatabaseBuilder databaseBuilder)
{
databaseBuilder.Document<ExampleDataCouchDB>().ToDatabase("exampledata");
databaseBuilder.Document<DesignDocument>().ToDatabase("exampledata");
}
}
key = 5
var q = _couchDBContext.ExampleDatas.Where((d) => d.Id == key);
var r = q.Select(d => d.Id, d => d.Rev);
var documentId = r.FirstOrDefault(); // Use case 1 : KO
var documentId2 = r.FirstOrDefault((d) => d.Id == key); // Use case 2 : OK
var list = r.ToList(); // Use case 3 : OK
--> **documentId.Id = 1** --> should be 5
--> documentId2.Id = 5
--> list[0].Id = 5
Expected value for use case 1 : documentId.Id = 5
More debug detail there :
Use case 1 : r.FirstOrDefault(); KO
class QueryOptimizer, method Optimize(Expression e, string? discriminator) :
--> e = {{"selector":{"split_discriminator":"ExampleDataCouchDB"}}.Where(d => (d.Id == value(IsiaGroup.Backend.ExampleApi.Controllers.ExamplesController+<>c__DisplayClass15_0).key)).Select(value(System.Linq.Expressions.Expression`1[System.Func`2[IsiaGroup.Backend.ExampleApi.ModelsCouchDB.ExampleDataCouchDB,System.Object]][])).FirstOrDefault()}
--> discriminator = ExampleDataCouchDB
--> return is
{{"selector":{"split_discriminator":"ExampleDataCouchDB"}}.Where(d => (d.Id == "1019")).Select(value(System.Linq.Expressions.Expression`1[System.Func`2[IsiaGroup.Backend.ExampleApi.ModelsCouchDB.ExampleDataCouchDB,System.Object]][])).Where(d => (d.SplitDiscriminator == "ExampleDataCouchDB")).Take(1).FirstOrDefault()}
class QueryCompiler, method SendRequestWithFilter, line 89
--> body = "{\"selector\":{\"_id\":\"1019\"},\"fields\":[\"_id\",\"_rev\"],\"selector\":{\"split_discriminator\":\"ExampleDataCouchDB\"},\"limit\":1}"
Expected value for body :
"{"fields":["_id","_rev"],"selector":{"$and":[{"_id":"1019"},{"split_discriminator":"ExampleDataCouchDB"}}]},"limit":1}"
Use case 2 : r.FirstOrDefault((d) => d.Id == key); : OK
class QueryOptimizer, method Optimize(Expression e, string? discriminator) :
--> e = {{"selector":{"split_discriminator":"ExampleDataCouchDB"}}.Where(d => (d.Id == value(IsiaGroup.Backend.ExampleApi.Controllers.ExamplesController+<>c__DisplayClass15_0).key)).Select(value(System.Linq.Expressions.Expression`1[System.Func`2[IsiaGroup.Backend.ExampleApi.ModelsCouchDB.ExampleDataCouchDB,System.Object]][])).FirstOrDefault(d => (d.Id == value(IsiaGroup.Backend.ExampleApi.Controllers.ExamplesController+<>c__DisplayClass15_0).key))}
--> discriminator = ExampleDataCouchDB
--> return is
{{"selector":{"split_discriminator":"ExampleDataCouchDB"}}.Select(value(System.Linq.Expressions.Expression`1[System.Func`2[IsiaGroup.Backend.ExampleApi.ModelsCouchDB.ExampleDataCouchDB,System.Object]][])).Where(d => ((d.Id == "1019") AndAlso ((d.SplitDiscriminator == "ExampleDataCouchDB") AndAlso (d.Id == "1019")))).Take(1).FirstOrDefault()}
class QueryCompiler, method SendRequestWithFilter, line 89
--> body = "{\"fields\":[\"_id\",\"_rev\"],\"selector\":{\"$and\":[{\"_id\":\"1019\"},{\"split_discriminator\":\"ExampleDataCouchDB\"},{\"_id\":\"1019\"}]},\"limit\":1}"
Use case 3 : r.ToList(); OK
class QueryOptimizer, method Optimize(Expression e, string? discriminator) :
--> e = {{"selector":{"split_discriminator":"ExampleDataCouchDB"}}.Where(d => (d.Id == value(IsiaGroup.Backend.ExampleApi.Controllers.ExamplesController+<>c__DisplayClass15_0).key)).Select(value(System.Linq.Expressions.Expression`1[System.Func`2[IsiaGroup.Backend.ExampleApi.ModelsCouchDB.ExampleDataCouchDB,System.Object]][]))}
--> discriminator = ExampleDataCouchDB
--> return is
{{"selector":{"split_discriminator":"ExampleDataCouchDB"}}.Select(value(System.Linq.Expressions.Expression`1[System.Func`2[IsiaGroup.Backend.ExampleApi.ModelsCouchDB.ExampleDataCouchDB,System.Object]][])).Where(d => ((d.Id == "1019") AndAlso (d.SplitDiscriminator == "ExampleDataCouchDB")))}
class QueryCompiler, method SendRequestWithFilter, line 89
--> body = "{\"fields\":[\"_id\",\"_rev\"],\"selector\":{\"$and\":[{\"_id\":\"1019\"},{\"split_discriminator\":\"ExampleDataCouchDB\"}]}}"
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working