使用LINQ结合foreach循环

3
如何将以下代码更改为一个LINQ查询:
var items = (from s in db.WfRADocStates.Include(x => x.WfStateStatu)
                                       .Include(xx => xx.WfState)
                                       .Include(xxx => xxx.WfState.Dept)
                                       .Include(d => d.RADoc)
             where s.RADocID == docID
                && !s.isHistory
                && s.StatusID == 1
                && s.WfStateStatu.isToNotify
             select s).ToList();

foreach (var item in items)
{
    EmailHelper.notify(item);
}

1
请查看这个问题,注意应该使用LINQ来进行查询。 - Jonesopolis
1
@Jonesy ForEach 技术上并不是 LINQ。它是 List<T> 上的一个方法,而不是 IEnumerable<T>,只是碰巧接受一个委托作为参数,所以看起来与 LINQ 的查询语法相同。实际上,Where 才是 LINQ,Select 什么也不做,而 ForEach 只是在 LINQ 查询结果上调用 List<T> 中的一个方法。 - evanmcdonnal
@evanmcdonnal,我们不是在试图证明同样的观点吗? - Jonesopolis
5
你的代码很合理,不需要改动。查询产生一个“查询结果”,而循环则产生一个“副作用”。不要让一个“查询结果”产生“副作用”,那不是它的工作。查询的任务是回答问题,而不是执行任务。循环的任务是执行任务。 - Eric Lippert
2个回答

2

使用LINQ中的.ForEach:

(from s in db.WfRADocStates.Include(x=>x.WfStateStatu).Include(xx=>xx.WfState).Include(xxx=>xxx.WfState.Dept).Include(d=>d.RADoc)
         where
            s.RADocID == docID &&
            !s.isHistory &&
            s.StatusID == 1 &&
            s.WfStateStatu.isToNotifyCNH
         select s).ToList().ForEach(
                s => EmailHelper.notify(s)
         );

1
ForEach不是LINQ扩展方法,它是在List<T>中定义的。 - Selman Genç

1

请尝试以下代码(不包括所有的"include"无用内容);

Collection.Where(s => s.RadocID == docID && ...).ToList().ForEach(s => EmailHelper.notify(s));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接