2014-06-26 56 views
0

我正在尝试使用Linq执行select到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语句,我究竟做错了什么?问题在于where子句的xml部分。

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]'您的更新命令的where子句中:

如果要提取第一< SMSRoute>元素的值< ArrayOfSMSRoute下>它可能看起来应该像这样

'(/ArrayOfSMSRoute/SMSRoute[1])' 

注意关闭')'括号的新位置。