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;
}
我有以下查询:
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;
}