2014-06-26 3 views
0

Я пытаюсь сделать выбор с Linq to SQL. Столбец типа varchar должен быть преобразован в XML, и мне нужно оценить значение первого элемента, чтобы увидеть, совпадает ли оно со значением, которое я передаю в метод.Linq to SQL where предложение с varchar как xml

Здесь работает SQL заявление:

CREATE PROC [dbo].[GetQueuedMsgs] 
    @FirstSMSRoute VARCHAR(50) 
AS 
BEGIN 

SET NOCOUNT ON; 
UPDATE tblCommsQueue 
    SET isInProcess=1 
    OUTPUT     
     inserted.QueueID, 
     inserted.CommsGuid, 
     inserted.ValidityDT, 
     te.EncodingType, 
     inserted.DestAddress, 
     inserted.Msg, 
     '' as RoutingLabel, 
     inserted.SubmittedDT, 
     inserted.SendDT, 
     inserted.SystemID, 
     inserted.BusinessID, 
     inserted.smsRoute, 
     inserted.EncodingTypeID, 
     inserted.RequestingIP 
FROM tblCommsQueue tq WITH(HOLDLOCK) 
JOIN tblEncodingType te 
ON tq.EncodingTypeID=te.EncodingTypeID 
WHERE  
    SendDT<=GETDATE() 
    AND CommsTypeID=1 
    AND isInProcess=0 
    AND CAST(CAST(smsRoute as ntext) as xml).value('(/ArrayOfSMSRoute/SMSRoute)[1]','varchar(260)')[email protected] 

END

XML, заключается в следующем:

<?xml version="1.0" encoding="utf-16"?> 
    <ArrayOfSMSRoute xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  
     <SMSRoute>BGWASP</SMSRoute> 
     <SMSRoute>Grape</SMSRoute> 
     <SMSRoute>iliveit</SMSRoute> 
</ArrayOfSMSRoute> 

и LINQ к SQL заявление, что я делаю не так? Проблема заключается в xml-части предложения where.

var results = from RN in mdc.tblCommsQueueTests 
          where 
          RN.CommsTypeID == 1 
          && RN.isInProcess == false 
          && RN.SendDT <= DateTime.Now 
          //&& XDocument.Parse(RN.smsRoute).Descendants().Where(x => x.Name.LocalName == FirstRoute.ToString()).FirstOrDefault().Name == FirstRoute.ToString() 
          && (from r in XDocument.Parse(RN.smsRoute).Descendants().Elements("smsRoute") select r.Value).FirstOrDefault() == FirstRoute.ToString() 
          select RN; 
+0

какая проблема имеет код LINQ? – Tigran

+0

Это не исключение, но, оставляя в этой строке, я не получаю никаких результатов назад – BossRoss

ответ

0

Посмотрите на '(/ArrayOfSMSRoute/SMSRoute)[1]' в ИНЕКЕ вашей команды обновления:

, если вы хотите, чтобы извлечь значение первого элемента < SMSRoute> под < ArrayOfSMSRoute> он должен, вероятно, выглядеть так:

'(/ArrayOfSMSRoute/SMSRoute[1])' 

Обратите внимание на новое положение закрывающего ')' кронштейна.

Смежные вопросы