【问题标题】:Error when trying to join a view in linq-to-sql尝试在 linq-to-sql 中加入视图时出错
【发布时间】:2010-09-21 16:18:45
【问题描述】:

在尝试通过将视图与其他两个表连接起来从视图中提取数据时,我收到以下错误:“SQL Server 不处理 NText、Text、Xml 或 Image 数据类型的比较。”

这里是查询:

    var expeditions = from VE in context.ViewExpeditions
                      join SIAGR in context.SiteInAdviseGoodsRef on VE.DeliveryNotes equals SIAGR.Value
                      join SIA in context.SiteInAdvise on SIAGR.SiteInAdviseId equals SIA.Id
                      where SIA.Id == SiteInAdviseID
                      select VE;

这里是 ViewViewExpeditions:

SELECT ve.*, S.[$Refex] as SiteRefex,c.[$Refex] as ServiceRefex , DeliveryNotes = LEFT(o.list, LEN(o.list)-1),st.Status,st.StatusRefex 
from(
SELECT     
B.[$Id] AS Booking,
B.[$Refex] AS BookingRefex,
B.SiguxCPUE AS CartaDePorte,
SUM(ISNULL(BG.Weight, 0)) AS Weight,
SUM(ISNULL(BG.Volume, 0)) AS Volume,
ISNULL( SUBSTRING(B.Comments, 1, 100),'')  AS Comments, 
'Type' = 
      CASE 
         WHEN PickupSite IS NULL THEN 'Pickup'

         ELSE 'Delivery'
      END,
'Name' = 
      CASE 
         WHEN PickupSite IS NULL THEN PickupName

         ELSE DeliveryName
      END,
      'City' = 
      CASE 
         WHEN PickupSite IS NULL THEN PickupCity

         ELSE DeliveryCity
      END,
'PostalCode' = 
      CASE 
         WHEN PickupSite IS NULL THEN PickupPostalCode

         ELSE DeliveryPostalCode
      END,

'ContactName' = 
      CASE 
         WHEN PickupSite IS NULL THEN ISNULL(B.PickupContactName,'')

         ELSE ISNULL(B.DeliveryContactName,'')
      END,
 'ContactPhone' = 
      CASE 
         WHEN PickupSite IS NULL THEN ISNULL(B.PickupContactPhone,'')

         ELSE ISNULL( B.DeliveryContactPhone,'')
      END,



B.PickupDate AS DataExp,
B.DeliveryDate,
coalesce( B.PickupSite,B.DeliverySite) as 'Site',
b.Service,isnull(B.SiguxState,0) as SiguxState

FROM         dbo.BookingGoods AS BG 
INNER JOIN   dbo.Booking AS B ON BG.BookingId = B.[$Id] 

WHERE     (B.ExecutedBy = 2) AND B.SiguxCPUE is not null AND B.[$IsDeleted]=0
GROUP BY  B.PickupCity,b.PickupContactName,b.PickupContactPhone,b.PickupName,b.PickupPostalCode, B.DeliveryName,B.DeliverySite,  B.DeliveryCity, B.DeliveryPostalCode, B.DeliveryContactName, B.DeliveryContactPhone, B.PickupDate,  B.[$Id], B.SiguxCPUE, B.[$Refex], B.Comments,b.PickupSite,B.Service,B.SiguxState,B.DeliveryDate

) ve 
INNER join [ViewBookingActualStatus] st on st.Booking=ve.Booking
INNER join Service c on ve.Service=c.[$Id]
INNER JOIN dbo.Site AS S ON S.[$Id] = ve.Site   
 outer APPLY 
( 
        SELECT distinct
            CONVERT(VARCHAR(12), dbo.BookingGoodsRef.Value) + ', ' AS [text()] 
        FROM 
            dbo.BookingGoodsRef 
        WHERE 
            dbo.BookingGoodsRef.BookingId = ve.Booking and BookingGoodsRef.Type=13

        FOR XML PATH('') 
    ) o (list) 

我哪里错了?

注意:如果我尝试在 linqpad 中运行查询,它根本不会给我任何错误,并生成以下 sql:

SELECT [t0].[Booking], [t0].[BookingRefex], [t0].[CartaDePorte], [t0].[Weight], [t0].[Volume], [t0].[Comments], [t0].[Type], [t0].[Name], [t0].[City], [t0].[PostalCode], [t0].[ContactName], [t0].[ContactPhone], [t0].[DataExp], [t0].[DeliveryDate], [t0].[Site], [t0].[Service], [t0].[SiguxState], [t0].[SiteRefex], [t0].[ServiceRefex], [t0].[DeliveryNotes], [t0].[Status], [t0].[StatusRefex]
FROM [ViewExpeditions] AS [t0]
INNER JOIN [SiteInAdviseGoodsRef] AS [t1] ON [t0].[DeliveryNotes] = [t1].[Value]
INNER JOIN [SiteInAdvise] AS [t2] ON [t1].[SiteInAdviseId] = [t2].[$Id]
WHERE [t2].[$Id] = @p0

【问题讨论】:

    标签: linq-to-sql


    【解决方案1】:

    如果将生成的 SQL 从 LinqPad 复制到 SSMS 中并尝试运行它,是否得到了预期的结果?

    我猜您要加入的列之一(可能是DeliveryNotes)是ntexttext。 SQL Server 无法加入 text 列 - 您必须将两列强制转换为 varchar 或在两列上使用 substring

    【讨论】:

    • 我愚蠢到忘记在 DeliveryNotes 字段上执行 .ToString()。这样做之后,它运行得非常好!
    猜你喜欢
    • 2023-01-30
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多