2011-04-14 60 views
3

我只是做了以下内容:我可以看到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以外的所有TCP和WireShark端口(如果这些东西甚至可读),但我希望有更简单的方法。

+1

2:是的,SQL Server Profiler。它位于SQL Server性能工具下的开始菜单中。它默认显示所有会话中的所有语句,但您可以过滤自己的语句。 – Rup 2011-04-14 16:38:22

回答

0

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

GetCommand(items);要查看将要执行的SQL 。

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

您可以使用此:

yourContext.Log = Console.Out; 

但我不能肯定,如果这个记录所有SQL或只是select秒。

对于每个受影响的对象,您的SQL是不同的。 L2S将使用依赖关系来确定必须保存对象的顺序(如果顺序很重要),则会构造SQL insert,updatedelete语句以保留更改。生成的语句(尤其是update)取决于对象的哪些属性已更改。特别是没有办法查看将要执行的整个批次。

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

不,这是任何其他自动数据访问层将如何执行更新。

问题2(也许这应该是一个独立的 问题,但我会在这里尝试 ):有一个普遍的方式,只是 监视去 SQL Server 2008 R2中的SQL语句?我禁用了除了 TCP和WireShark的端口 ,但我希望有一个更容易的方法。

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

1

DataContext有一个Log属性,您可以将其挂接到转储已执行的SQL。还有Linq To Sql Profiler这真棒。

0

关于效率 - 当然,有更高效的方式来执行更新,因为它存在于您的问题中;例如,像这样的SQL查询会更有效率(不会执行SELECT查询,执行代码以将数据从SQL中拖到一组对象中,执行代码以对对象执行更新,执行代码确定哪些对象执行生成相应的SQL语句和UPDATE查询SQL服务器上执行)改变,代码:

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

但LINQ到SQL不提供建立这样的查询的任何方式。如果您要以与您的问题类似的非常简单的方式更新数千行,则可以更好地运行类似于此的SQL语句。如果没有多行更新或者逻辑更复杂,那么将它保存在Linq to SQL中。