[英]Linq to SQL where clause with varchar as xml
我正在嘗試使用Linq to SQL進行選擇。 需要將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)')=@FirstSMSRoute
結束
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 to 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;
看一下更新命令的where子句中的'(/ArrayOfSMSRoute/SMSRoute)[1]'
:
如果要提取<ArrayOfSMSRoute>下的第一個<SMSRoute>元素的值,則可能看起來像這樣:
'(/ArrayOfSMSRoute/SMSRoute[1])'
注意右括號')'的新位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.