From b1ba0dfbc082aa4337df9c6bd22bcf441ad1de09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hakan=20F=C4=B1st=C4=B1k?= Date: Mon, 28 Jul 2025 15:03:13 +0200 Subject: [PATCH] CA1826: Use property instead of Linq Enumerable method https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1826 --- src/CoreTests/DocumentCleanerTests.cs | 2 +- src/CoreTests/adding_custom_schema_objects.cs | 12 +++++----- .../build_aggregate_multiple_projections.cs | 4 ++-- .../Configuration/DocumentMappingTests.cs | 2 +- .../Aggregation/stream_compacting.cs | 4 ++-- ...tore_with_string_identifiers_for_stream.cs | 2 +- .../removing_protected_information.cs | 8 +++---- src/EventSourcingTests/replacing_events.cs | 22 +++++++++---------- ..._JObject_in_dictionary_duplicated_field.cs | 2 +- .../Events/EventStore.StreamCompacting.cs | 4 ++-- src/Marten/Events/QueryEventStore.cs | 4 ++-- 11 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/CoreTests/DocumentCleanerTests.cs b/src/CoreTests/DocumentCleanerTests.cs index 755b339cfc..9a1883865a 100644 --- a/src/CoreTests/DocumentCleanerTests.cs +++ b/src/CoreTests/DocumentCleanerTests.cs @@ -239,7 +239,7 @@ async Task GetSequenceCount(IDocumentStore store) var values = await session.QueryAsync(@"select count(*) from information_schema.sequences s where s.sequence_name like ? and s.sequence_schema = any(?);", "mt_%", allSchemas); - return values.First(); + return values[0]; } (await GetSequenceCount(theStore)).ShouldBeGreaterThan(0); diff --git a/src/CoreTests/adding_custom_schema_objects.cs b/src/CoreTests/adding_custom_schema_objects.cs index 918e9d6a8a..ca886e0a85 100644 --- a/src/CoreTests/adding_custom_schema_objects.cs +++ b/src/CoreTests/adding_custom_schema_objects.cs @@ -94,7 +94,7 @@ public async Task enable_an_extension() var result = await session.QueryAsync("select unaccent('Æ') = 'AE';"); - result.First().ShouldBe(true); + result[0].ShouldBe(true); } [Fact] @@ -158,7 +158,7 @@ public async Task enable_an_extension_with_multitenancy_with_tenants_upfront_thr await using var sessionNext = theStore.QuerySession(tenantId); var result = await sessionNext.QueryAsync("select unaccent('Æ') = 'AE';"); - result.First().ShouldBe(true); + result[0].ShouldBe(true); } [Fact] @@ -186,7 +186,7 @@ public async Task enable_an_extension_with_multitenancy_with_tenants_upfront_thr var session = theStore.QuerySession(tenantId); var result = await session.QueryAsync("select unaccent('Æ') = 'AE';"); - result.First().ShouldBe(true); + result[0].ShouldBe(true); } [Fact] @@ -221,8 +221,8 @@ create or replace function iif( var match = await session.QueryAsync("select iif(1 = 1, 'value matches'::text, 'no match'::text);"); var noMatch = await session.QueryAsync("select iif(1 = 2, 'value matches'::text, 'no match'::text);"); - match.First().ShouldBe("value matches"); - noMatch.First().ShouldBe("no match"); + match[0].ShouldBe("value matches"); + noMatch[0].ShouldBe("no match"); } [Fact] @@ -249,7 +249,7 @@ public async Task create_a_sequence() var value = await session.QueryAsync("select nextval('banana_seq')"); var valueAgain = await session.QueryAsync("select nextval('banana_seq')"); - valueAgain.First().ShouldBe(value.First() + 1); + valueAgain[0].ShouldBe(value[0] + 1); } private async Task DropDatabaseIfExists(string databaseName) diff --git a/src/DaemonTests/Aggregations/build_aggregate_multiple_projections.cs b/src/DaemonTests/Aggregations/build_aggregate_multiple_projections.cs index 35b36838c5..9f74470d0d 100644 --- a/src/DaemonTests/Aggregations/build_aggregate_multiple_projections.cs +++ b/src/DaemonTests/Aggregations/build_aggregate_multiple_projections.cs @@ -217,7 +217,7 @@ public async Task rebuild_with_gaps_in_sequence_from_initial_position_before_hig var cars = await session.Query().ToListAsync(); waterMark.ShouldBe(maxSeqId); - cars.Last().Name.ShouldBe("car-name-999"); + cars[cars.Count - 1].Name.ShouldBe("car-name-999"); } } @@ -283,7 +283,7 @@ public async Task rebuild_with_gaps_in_sequence_from_initial_position_after_high var cars = await session.Query().ToListAsync(); waterMark.ShouldBe(maxSeqId); - cars.Last().Name.ShouldBe("car-name-999"); + cars[cars.Count - 1].Name.ShouldBe("car-name-999"); } } diff --git a/src/DocumentDbTests/Configuration/DocumentMappingTests.cs b/src/DocumentDbTests/Configuration/DocumentMappingTests.cs index 15e8b452e5..e32dfeefe5 100644 --- a/src/DocumentDbTests/Configuration/DocumentMappingTests.cs +++ b/src/DocumentDbTests/Configuration/DocumentMappingTests.cs @@ -475,7 +475,7 @@ public void to_table_columns_with_subclasses() var table = new DocumentTable(mapping); - var typeColumn = table.Columns.Last(); + var typeColumn = table.Columns[table.Columns.Count - 1]; typeColumn.Name.ShouldBe(SchemaConstants.DocumentTypeColumn); typeColumn.Type.ShouldBe("varchar"); } diff --git a/src/EventSourcingTests/Aggregation/stream_compacting.cs b/src/EventSourcingTests/Aggregation/stream_compacting.cs index 1df6407b0b..e020a3fea7 100644 --- a/src/EventSourcingTests/Aggregation/stream_compacting.cs +++ b/src/EventSourcingTests/Aggregation/stream_compacting.cs @@ -261,7 +261,7 @@ await theSession.Events.CompactStreamAsync(streamId, x => var events = await theSession.Events.FetchStreamAsync(streamId); events.Count.ShouldBe(5); - var compacted = events.First().ShouldBeOfType < Event>>(); + var compacted = events[0].ShouldBeOfType < Event>>(); compacted.Version.ShouldBe(5); compacted.Data.Snapshot.ACount.ShouldBe(2); compacted.Data.Snapshot.BCount.ShouldBe(1); @@ -332,7 +332,7 @@ public async Task end_to_end_string_identification_at_specified_version() var events = await theSession.Events.FetchStreamAsync(streamId); events.Count.ShouldBe(5); - var compacted = events.First().ShouldBeOfType < Event>>(); + var compacted = events[0].ShouldBeOfType < Event>>(); compacted.Version.ShouldBe(5); compacted.Data.Snapshot.ACount.ShouldBe(2); compacted.Data.Snapshot.BCount.ShouldBe(1); diff --git a/src/EventSourcingTests/event_store_with_string_identifiers_for_stream.cs b/src/EventSourcingTests/event_store_with_string_identifiers_for_stream.cs index 6ffbf9ede9..bfb6c230d7 100644 --- a/src/EventSourcingTests/event_store_with_string_identifiers_for_stream.cs +++ b/src/EventSourcingTests/event_store_with_string_identifiers_for_stream.cs @@ -35,7 +35,7 @@ public void use_string_id_if_as_string_identifiers() pk.Type.ShouldBe("varchar"); pk.Name.ShouldBe("id"); - table.Columns.First().Name.ShouldBe("id"); + table.Columns[0].Name.ShouldBe("id"); } [Fact] diff --git a/src/EventSourcingTests/removing_protected_information.cs b/src/EventSourcingTests/removing_protected_information.cs index cc03146e6f..f8e407cd91 100644 --- a/src/EventSourcingTests/removing_protected_information.cs +++ b/src/EventSourcingTests/removing_protected_information.cs @@ -170,7 +170,7 @@ await theStore.Advanced.ApplyEventDataMasking(x => joined.Headers["opid"].ShouldBe(1); // The last event does not get masked - events.Last().Headers["color"].ShouldBe("blue"); + events[events.Count - 1].Headers["color"].ShouldBe("blue"); // Should *not* apply here var events2 = await theSession.Events.FetchStreamAsync(streamId2); @@ -232,7 +232,7 @@ await theStore.Advanced.ApplyEventDataMasking(x => joined.Headers["opid"].ShouldBe(1); // The last event does not get masked - events.Last().Headers["color"].ShouldBe("blue"); + events[events.Count - 1].Headers["color"].ShouldBe("blue"); // Should *not* apply here var events2 = await theSession.Events.FetchStreamAsync(streamId2); @@ -290,7 +290,7 @@ await theStore.Advanced.ApplyEventDataMasking(x => } // The last event does not get masked - events.Last().Headers["color"].ShouldBe("blue"); + events[events.Count - 1].Headers["color"].ShouldBe("blue"); // Should *not* apply here var events2 = await theSession.Events.FetchStreamAsync(streamId2); @@ -354,7 +354,7 @@ await theStore.Advanced.ApplyEventDataMasking(x => joined.Headers["opid"].ShouldBe(1); // The last event does not get masked - events.Last().Headers["color"].ShouldBe("blue"); + events[events.Count - 1].Headers["color"].ShouldBe("blue"); // Should *not* apply here var events2 = await theSession.Events.FetchStreamAsync(streamId2); diff --git a/src/EventSourcingTests/replacing_events.cs b/src/EventSourcingTests/replacing_events.cs index 1013fc2fab..e7eca9b426 100644 --- a/src/EventSourcingTests/replacing_events.cs +++ b/src/EventSourcingTests/replacing_events.cs @@ -22,21 +22,21 @@ public async Task simple_replacement_default_settings() var events = await theSession.Events.FetchStreamAsync(streamId); - var sequence = events.Last().Sequence; + var sequence = events[events.Count - 1].Sequence; var joined2 = new MembersJoined { Members = ["Moiraine", "Lan"] }; theSession.Events.CompletelyReplaceEvent(sequence, joined2); await theSession.SaveChangesAsync(); var events2 = await theSession.Events.FetchStreamAsync(streamId); - var final = events2.Last().ShouldBeOfType>(); + var final = events2[events2.Count - 1].ShouldBeOfType>(); // These should not change - final.Version.ShouldBe(events.Last().Version); - final.Sequence.ShouldBe(events.Last().Sequence); + final.Version.ShouldBe(events[events.Count - 1].Version); + final.Sequence.ShouldBe(events[events.Count - 1].Sequence); // Id gets changed - final.Id.ShouldNotBe(events.Last().Id); + final.Id.ShouldNotBe(events[events.Count - 1].Id); // These need to get changed final.Data.Members.ShouldBe(["Moiraine", "Lan"]); @@ -64,22 +64,22 @@ public async Task simple_replacement_all_metadata_turned_on() var events = await theSession.Events.FetchStreamAsync(streamId); - var sequence = events.Last().Sequence; + var sequence = events[events.Count - 1].Sequence; var joined2 = new MembersJoined { Members = ["Moiraine", "Lan"] }; theSession.Events.CompletelyReplaceEvent(sequence, joined2); await theSession.SaveChangesAsync(); var events2 = await theSession.Events.FetchStreamAsync(streamId); - var final = events2.Last().ShouldBeOfType>(); + var final = events2[events2.Count - 1].ShouldBeOfType>(); // These should not change - final.Version.ShouldBe(events.Last().Version); - final.Sequence.ShouldBe(events.Last().Sequence); + final.Version.ShouldBe(events[events.Count - 1].Version); + final.Sequence.ShouldBe(events[events.Count - 1].Sequence); // Id gets changed - final.Id.ShouldNotBe(events.Last().Id); - final.Timestamp.ShouldNotBe(events.Last().Timestamp); + final.Id.ShouldNotBe(events[events.Count - 1].Id); + final.Timestamp.ShouldNotBe(events[events.Count - 1].Timestamp); // These need to get changed final.Data.Members.ShouldBe(["Moiraine", "Lan"]); diff --git a/src/Marten.NodaTime.Testing/Bug_2307_JObject_in_dictionary_duplicated_field.cs b/src/Marten.NodaTime.Testing/Bug_2307_JObject_in_dictionary_duplicated_field.cs index 8ef6d47c6e..6acf047af2 100644 --- a/src/Marten.NodaTime.Testing/Bug_2307_JObject_in_dictionary_duplicated_field.cs +++ b/src/Marten.NodaTime.Testing/Bug_2307_JObject_in_dictionary_duplicated_field.cs @@ -55,7 +55,7 @@ public async Task reproduction() .ToListAsync(default); instanceFilesTask.Count.ShouldBePositive(); - instanceFilesTask.First().InstanceData["Data"].ShouldBe("Pew Pew"); + instanceFilesTask[0].InstanceData["Data"].ShouldBe("Pew Pew"); } } } diff --git a/src/Marten/Events/EventStore.StreamCompacting.cs b/src/Marten/Events/EventStore.StreamCompacting.cs index b78a994402..e4eb1a5829 100644 --- a/src/Marten/Events/EventStore.StreamCompacting.cs +++ b/src/Marten/Events/EventStore.StreamCompacting.cs @@ -112,8 +112,8 @@ internal async Task ExecuteAsync(DocumentSessionBase session) var sequences = events.Select(x => x.Sequence).Take(events.Count - 1).ToArray(); - Version = events.Last().Version; - Sequence = events.Last().Sequence; + Version = events[events.Count - 1].Version; + Sequence = events[events.Count - 1].Sequence; // 3. Aggregate up to the new snapshot var aggregate = await aggregator.BuildAsync(events, session, default, CancellationToken).ConfigureAwait(false); diff --git a/src/Marten/Events/QueryEventStore.cs b/src/Marten/Events/QueryEventStore.cs index f4531ff3d6..576a9c7a65 100644 --- a/src/Marten/Events/QueryEventStore.cs +++ b/src/Marten/Events/QueryEventStore.cs @@ -79,7 +79,7 @@ public async Task> FetchStreamAsync(string streamKey, long return state; } - if (version != 0 && version > events.Last().Version) return null; + if (version != 0 && version > events[events.Count - 1].Version) return null; var aggregator = _store.Options.Projections.AggregatorFor(); var aggregate = await aggregator.BuildAsync(events, _session, state, token).ConfigureAwait(false); @@ -133,7 +133,7 @@ public async Task> FetchStreamAsync(string streamKey, long return state; } - if (version != 0 && version > events.Last().Version) return null; + if (version != 0 && version > events[events.Count - 1].Version) return null; var aggregator = _store.Options.Projections.AggregatorFor();