问题描述
|
我只是做了以下事情:
var items =
from c in Items
where
c.Pid == Campaigns.Where(d=>d.Campaign_name==\"US - Autos.com\").First().Pid
&& c.Affid == Affiliates.Where(e=>e.Add_code==\"CD4729\").First().Affid
select c;
然后,我想为所有结果更新一个字段:
items.ToList().ForEach(c=>c.Cost_per_unit=8);
SubmitChanges();
查询时,我知道可以使用:
GetCommand(items);
查看将要执行的sql。
但是提交更改时,我不知道该怎么做。
我看着:
GetChangeSet()
在这种情况下,我看到大约有18个更新。
问题1:使用L2S更新这种方式是否存在效率问题?
问题2(也许这应该是一个单独的问题,但是我将在这里尝试):是否有一种通用方法可以只监视进入sql Server 2008 R2的sql语句?我想我可以禁用实例的TCP以外的所有功能,并禁用WireShark的端口(如果这些内容甚至可读),但是我希望有一种更简单的方法。
解决方法
DataContext具有Log属性,您可以将其挂钩以转储已执行的SQL。还有很棒的Linq To Sql Profiler。
, 查询时,我知道可以使用:
GetCommand(items);
看SQL
将被执行。
但是在提交更改时,我不会
知道该怎么做。
您可能可以使用此功能:
yourContext.Log = Console.Out;
但是我不确定这是否记录所有SQL或仅记录6个。
每个受影响的对象的SQL不同。 L2S将使用依赖关系来确定对象保存的顺序(如果顺序很重要),然后将构造SQLinsert
,update
和and9ѭ语句以保留更改。生成的语句(特别是对于“ 8”而言)取决于对象的哪些属性已更改。特别没有办法查看将要执行的整个批处理。
问题1:有效率吗
使用L2S更新此问题吗?
不,这是任何其他自动数据访问层执行更新的方式。
问题2(也许应该是
单独的问题,但我会尝试
这里):有没有一般的方法
监视转到的SQL语句
SQL Server 2008 R2?我禁用所有
实例和WireShark的TCP
端口,但我希望有一个简单的方法
办法。
这应该是另一个问题,但是答案是使用跟踪。尽管可以使用任何版本的SQL Server(包括Express)进行跟踪,但Express以外的所有版本附带的SQL Server Profiler工具使此操作非常容易。如果您需要更多有关此方面的信息,请随时针对您的具体问题提出另一个问题。
,关于效率-当然,存在您问题中存在的更有效的更新方式;例如,这样的SQL查询会效率更高(不会执行SELECT查询,不会执行将SQL中的数据提取到一组对象中的代码,会执行对对象进行更新的代码,会执行以下代码:确定哪些对象已更改,执行代码以生成适当的SQL语句以及在SQL Server上执行的UPDATE查询):
UPDATE Items SET Cost_per_unit = @CostPerUnit
FROM Items
JOIN Campaigns ON ...
JOIN Affiliates ON ...
WHERE ...
但是Linq to SQL没有提供构建这种查询的任何方法。如果您将以与问题类似的非常简单的方式来更新数千行,则最好运行这样的SQL语句。如果不会更新那么多行,或者逻辑更加复杂,则将其保留在Linq to SQL中。