Entity Framework - 检查 foreach/update 查询

Entity Framework - inspect foreach/update query

我有以下查询:

db.Context.SomeTable
    .Where(x => x.abc == someAbc && x.zyx == someZyx)
    .ForEach(y =>
    {
        y.AuditId = newAuditId;
        y.TimeStamp = newTimestamp;
    });

我想从 ForEach 语句中获取实际的 SQL 查询。

如果我只执行以下操作:

var selectQuery = db.Context.SomeTable
        .Where(x => x.abc == someAbc && x.zyx == someZyx);

我可以从 selectQuery 变量中得到以下查询:

SELECT 
    [Extent1].[abc] AS [abc], 
    [Extent1].[zyx] AS [zyx] 
    --skipping some [Extent1]. statements for simplicity here
FROM 
    [dbo].[SomeTable] AS [Extent1]
WHERE 
    ([Extent1].[abc] = @p__linq__0) AND ([Extent1].[zyx] = @p__linq__1)

然后我可以 运行 在 Visual Studio 之外,分析它的性能等

如何为 ForEach 语句执行此操作?

ForEach 执行并从您的服务器获取数据。 ForEach 没有翻译成 SQL。它只是执行您刚刚编写的 Linq To Entities :

var selectQuery = db.Context.SomeTable
    .Where(x => x.abc == someAbc && x.zyx == someZyx);

这会生成您在问题中写的 SQL。

看看设置这个。

https://msdn.microsoft.com/en-us/library/system.data.entity.database.log(v=vs.113).aspx

我过去用过这个,但是当你得到查询时它已经被执行了。这可能对您有帮助,也可能没有帮助。

如前所述,ForEach 不会 被翻译成 SQL 语句。如果您想在 .NET 中进行这些更改并将它们保存回数据库,那么您需要调用 SaveChanges 来更新数据源:

var items = db.Context.SomeTable
                      .Where(x => x.abc == someAbc && x.zyx == someZyx);

foreach(var item in items)
{
        item.AuditId = newAuditId;
        item.TimeStamp = newTimestamp;
}

db.Context.SaveChanges();

我想你忘了在 'foreach' 之前提到 'ToList()'。您需要一个数组或列表来执行循环。

这是我的例子,

public HomePageBannerModel GetBannerImage()
        {
            var banner = new HomePageBannerModel();
            _jBannerRepository.Table.Where(x => x.BannerType == BannerTypes.Home).ToList()
           .ForEach(y =>
           {
               switch (y.Size)
               {
                   case "M":
                       banner.Md = _pictureService.GetPictureUrl(y.PictureId);
                       break;
                   case "S":
                       banner.Sm = _pictureService.GetPictureUrl(y.PictureId);
                       break;
                   default:
                       banner.Lg = _pictureService.GetPictureUrl(y.PictureId);
                       break;
               }
           });

            return banner;
        }