Samantha J T Star
Samantha J T Star

Reputation: 32778

Can I combine a foreach and a LINQ query into one?

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

Answers (4)

Borys Generalov
Borys Generalov

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

John Saunders
John Saunders

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

dav_i
dav_i

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

Tolga Evcimen
Tolga Evcimen

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

Related Questions