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;
LINQ代码有什么问题? – Tigran
它不会抛出异常,但在离开时我不会得到任何结果 – BossRoss