Skip to content

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

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
cfeltz34 opened this issue Mar 21, 2023 · 0 comments
Assignees
Labels
bug Something isn't working

Comments

@cfeltz34
Copy link

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\"}]}}"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants