Skip to content

Database Splitting + FirstOrDefault() + CouchContext.MyDatabase.Where doesn't apply predicate #185

@cfeltz34

Description

@cfeltz34

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

Labels

bugSomething isn't working

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions