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

本文关键字:更新 L2S 记录 效率 SQL 我可以 | 更新日期: 2023-09-27 17:50:07

我刚刚做了以下操作:

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。

但是在提交更改时,我不知道该怎么做。

I look at:

GetChangeSet()

我看到这里大约有18个更新。

问题1:使用L2S以这种方式更新是否存在效率问题?

问题2(也许这应该是一个单独的问题,但我会在这里尝试):是否有一种通用的方法来监控SQL Server 2008 R2的SQL语句?我想我可以禁用所有,但TCP的实例和WireShark端口(如果东西甚至是可读的),但我希望有一个更简单的方法。

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

DataContext有一个Log属性,您可以钩入该属性来转储已执行的SQL。还有一个很棒的Linq To Sql Profiler

查询时,我知道我可以使用:

GetCommand(items);查看SQL

但是在提交更改时,我没有我知道怎么做。

你可以这样写:

yourContext.Log = Console.Out;

但我不确定这是否记录所有的SQL或只是select s。

每个受影响对象的SQL是不同的。L2S将使用依赖关系来确定对象必须保存的顺序(如果顺序很重要),然后构建SQL insertupdatedelete语句来持久化更改。生成的语句(特别是update)取决于对象的哪些属性发生了变化。没有特别的方法来查看将要执行的整个批处理。

问题1:有效率吗使用L2S以这种方式更新的问题?

不,这是其他自动数据访问层执行更新的方式。

问题2(也许这应该是一个这是另一个问题,但我会试试的这里):有没有一个通用的方法来监视到的SQL语句SQL Server 2008 R2?我禁用了所有TCP为实例,WireShark为实例港口,但我希望有更简单的方式。

这应该是另一个问题,但答案是使用跟踪。虽然您可以使用任何版本的SQL Server(包括Express)进行跟踪,但除了Express之外的所有版本附带的SQL Server Profiler工具使此操作非常容易。如果您想了解更多有关这方面的信息,请随时就您的具体问题提出另一个问题。

关于效率-当然有更有效的方式来执行更新,因为它存在于你的问题;例如,像这样的SQL查询将更加高效(不需要执行SELECT查询、执行将数据从SQL拉入一组对象的代码、执行对对象进行更新的代码、执行确定哪些对象更改的代码、执行生成适当SQL语句的代码,以及在SQL服务器上执行update查询):

UPDATE Items SET Cost_per_unit = @CostPerUnit
FROM Items
    JOIN Campaigns ON ...
    JOIN Affiliates ON ...
WHERE ...

但是Linq to SQL没有提供任何方法来构建这样的查询。如果您打算以与您的问题类似的非常简单的方式更新数千行,那么运行这样的SQL语句可能会更好。如果不需要更新那么多行,或者逻辑比较复杂,那么就把它放在Linq to SQL中。