Reputation: 32778
I have a C# code that looks like this:
foreach (var entry in this.ChangeTracker.Entries()
.Where(e => e.Entity is IAuditableTable &&
e.State == EntityState.Added))
{
IAuditableTable e = (IAuditableTable)entry.Entity;
e.ModifiedDate = DateTime.Now;
}
This seems to be like a combination of foreach and LINQ. Can sometone tell me is it possible for me to remove the foreach and combine this into one LINQ statement
Upvotes: 8
Views: 15007
Reputation: 2345
Here you go:
this.ChangeTracker.Entries()
.Where(e => e.Entity is IAuditableTable && e.State == EntityState.Added)
.ToList()
.ForEach(entry => {
IAuditableTable e = (IAuditableTable) entry.Entity;
e.ModifiedDate = DateTime.Now;
});
Upvotes: 4
Reputation: 161773
The best you could do is
foreach (var entry in from x in this.ChangeTracker.Entries()
where x.Entity is IAuditableTable &&
x.State == EntityState.Added
select (IAuditableTable)x.Entity)
{
entry.ModifiedDate = DateTime.Now;
}
There is no query syntax for updates.
Upvotes: 7
Reputation: 28107
I'd suggest not doing this. Keep everything as readable as possible:
var auditableTables = this.ChangeTracker.Entries()
.Where(e => e.State == EntityState.Added)
.Select(e => e.Entity)
.OfType<IAuditableTable>();
foreach (var table in auditableTables)
{
table.ModifiedDate = DateTime.Now;
}
My rule of thumb for coding - if you can't read it like a sentence, then it needs fixing.
Upvotes: 34
Reputation: 7352
This should do it.
this.ChangeTracker.Entries()
.Where(e => e.Entity is IAuditableTable &&
e.State == EntityState.Added)
.ToList().ForEach(entry => {
IAuditableTable e = (IAuditableTable)entry.Entity;
e.ModifiedDate = DateTime.Now;
});
Upvotes: 3