Проблема при преобразовании SQL в LINQ - PullRequest
0 голосов
/ 21 октября 2011

Я пытаюсь преобразовать хранимую процедуру 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. Может кто-то указать мне верное направление? Приветствия

Я пока основывал свой код на этом примере:

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 ]

1 голос
/ 21 октября 2011

Предполагая, что у вас есть связь между 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, вы должны приложить усилия, чтобы описать, что вы делаете в любом отношении, чтобы помочь вам узнайте, что происходит и где необходимо улучшить производительность (в том числе при необходимости использовать Stored Procs / custom ADO).

1 голос
/ 21 октября 2011

Linq-2-sql НИКОГДА не будет превосходить хранимую процедуру.

В конце концов, все, что делает Linq-2-sql, дает вам более объектно-ориентированный подход, но в итоге это SQL, который отправляется в базу данных.Так что если вы поместите тот же SQL в хранимую процедуру, он по определению будет, по крайней мере, одинаково быстрым.

0 голосов
/ 21 октября 2011

! является оператором C # Вы хотите "Не" вместо этого для VB.Net.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...