将子查询组合成1个查询Linq

时间:2012-04-09 13:32:59

标签: linq

有没有办法可以重写以下查询,使其只有一个查询?

 try
            {
                var fileIds = (from f in context.SignalTo
                               where f.SignalFileID == 2
                               select new { f.GFileID }).ToList();



                foreach (var id in fileIds)
                {
                  var pp = (from p in context.ProjectFiles
                                   where p.FileID == id.GFileID &&  p.ProjectID == ProjectID
                                   select p);

                    if (pp != null)
                    {
                        ProjectFiles projectFile =(ProjectFiles) pp;
                        projectFile.MStatus = Status;
                        projectFile.DateLastUpdated = DateTime.Now;
                        context.SaveChanges();
                    }


                }
            }

1 个答案:

答案 0 :(得分:1)

您可以将代码的两个查询部分合并为一个。

然后,您需要循环结果集,进行更新。然后,您将调用context.SaveChanges以一批提交所有更改。

我无法判断您的现有代码是否实际运行或编译,但您需要这样的内容:

获取您感兴趣的文件ID列表:

var fileIds = from f in context.SignalTo
              where f.SignalFileID == 2
              select f.GFileID;

fileIds 在这一点上是一个IQueryable,我假设T是一个Int。目前尚无任何查询。

现在你可以做到

var pps = from p in context.ProjectFiles
         where fileIds.Contains(p.FileID) &&  p.ProjectID == ProjectID
         select p;

仍然没有执行查询。

然后迭代结果集

foreach( var pp in pps ) // query executed now
{
    pp.MStatus = Status;
    pp.DateLastUpdated = DateTime.Now;
}

context.SaveChanges(); // batch of updates executed now