我可以将foreach和LINQ查询合并为一个吗?

本文关键字:一个 foreach LINQ 合并 查询 我可以 | 更新日期: 2023-09-27 18:02:27

我有一个c#代码,看起来像这样:

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;
}

这看起来像是foreach和LINQ的组合。有人能告诉我,我是否可以删除foreach并将其合并到一个LINQ语句

我可以将foreach和LINQ查询合并为一个吗?

我建议不要这样做。保持所有内容尽可能可读:

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;
}

我的经验法则——如果你不能像读句子一样读它,那么它需要修改。

你能做的最好的就是

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;
}

更新没有查询语法

给你:

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;
    });

应该可以了。

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;
    });