将SQL转换为LINQ时出现问题

时间:2011-10-21 11:41:20

标签: sql linq linq-to-sql

我正在尝试将SQL存储过程转换为LINQ以进行一些性能测试(试图弄清楚在我们的某些方法中使用LINQ是否会加快速度)

我在LINQ做任何事情都是新手,所以我只是修改书籍/网上的例子以满足我的需要而且我坚持不懈。

到目前为止我有这个代码:

DIM TicketID as INTEGER = 1

DIM s = 
FROM User in PersonnelTbl 
WHERE !(from t in tblSupportTicketNotifications where t.TicketID = TicketID select t.EmployeeID).Contains(User.EmployeeID)
Select user

我不知道为什么但是我在Where子句行上得到了一个Identifier期望的错误消息。谁能指出我正确的方向?干杯

到目前为止,我的代码基于此示例:

var query = 

    from c in dc.Customers 

    where !(from o in dc.Orders 

            select o.CustomerID)

           .Contains(c.CustomerID) 

    select c;

这就是我想要转换的内容

CREATE PROCEDURE spGetEmployeesToBeNotified  
(  
 @TicketID INT  
)  
AS   
BEGIN  

 SELECT   
  ID,   
  FirstName,  
  Surname,  
  FirstName+' '+Surname As FullName,   
  WorkEmail,   
  0 AS Checked  
 FROM   
  PersonnelTbl   
 WHERE   
  ID NOT IN(SELECT EmployeeID FROM tblSupportTicketNotifications WHERE TicketID = @TicketID)  
 AND  
  (FirstName IS NOT NULL   
  AND   
   FirstName <> ''   
  AND   
   Surname IS NOT NULL   
  AND   
   Surname <> '')  

 UNION  
 SELECT   
  person.ID,  
  person.FirstName,  
  person.Surname,  
  person.FirstName +' '+person.Surname As FullName,  
  person.WorkEmail,  
  1 AS Checked  
 FROM  
  PersonnelTbl person  
 JOIN  
  tblSupportTicketNotifications notify  
 ON  
  person.ID = notify.EmployeeID  
 WHERE  
  TicketID = @TicketID  
 ORDER BY   
  FirstName ASC,   
  Surname ASC  
END

3 个答案:

答案 0 :(得分:1)

Linq-2-sql绝不会超过存储过程。

最后,Linq-2-sql所做的就是为您提供一种更面向对象的方法,但最终它将被发送到数据库。因此,如果您将相同的SQL放在存储过程中,那么根据定义它至少同样快。

答案 1 :(得分:1)

假设您在User和SupportTicketNotifications之间存在关联,您可以尝试使用Exists子句而不是In的以下内容。然后,您可以分析SQL中的差异,以查看哪一个实际上更快(或者如果SQL引擎将它们优化为相同的东西。)

DIM TicketID as INTEGER = 1 

DIM s =  
FROM User in PersonnelTbl  
WHERE Not User.SupportTicketNotifications.Any(Function(t) t.TicketID = TicketID)

' The Select is optional in VB if you are just returning the item you are selecting.

关于使用LINQ to SQL与原始ADO相比的性能,您可能需要查看http://blogs.msdn.com/ricom/archive/2007/06/22/dlinq-linq-to-sql-performance-part-1.aspx。在学习LINQ时,您应该努力分析您在做什么,以帮助您了解正在发生的事情以及您需要在哪些方面进行性能改进(包括在必要时使用存储过程/自定义ADO)。

答案 2 :(得分:0)

!是一个C#运算符。你想要“不”代替VB.Net。