我可以看到SQL /正在使用L2S更新多个记录的效率吗?

问题描述

| 我只是做了以下事情:
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将使用依赖关系来确定对象保存的顺序(如果顺序很重要),然后将构造SQL
insert
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中。