我可以看到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端口(如果东西甚至是可读的),但我希望有一个更简单的方法。
DataContext有一个Log属性,您可以钩入该属性来转储已执行的SQL。还有一个很棒的Linq To Sql Profiler
查询时,我知道我可以使用:
GetCommand(items);
查看SQL但是在提交更改时,我没有我知道怎么做。
你可以这样写:
yourContext.Log = Console.Out;
但我不确定这是否记录所有的SQL或只是select
s。
每个受影响对象的SQL是不同的。L2S将使用依赖关系来确定对象必须保存的顺序(如果顺序很重要),然后构建SQL insert
、update
和delete
语句来持久化更改。生成的语句(特别是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中。