Search code examples
sqlvb.netlinqtranslate

SQL into LINQ... need a nudge in the right direction


I want to use LINQ as a DataGrivdView Datasource... I have the correct SQL query, but I'm having a heck of a time re-writing it in LINQ...

SQL:

SELECT ICITEM.ITEMNO, ICITEM.[DESC], MAX(PORCPL.DTARRIVAL) AS Expr1
FROM   ICITEM INNER JOIN
        PORCPL ON PORCPL.ITEMNO = ICITEM.ITEMNO
WHERE  (ICITEM.ITEMNO LIKE '%R001%')
GROUP BY ICITEM.ITEMNO, ICITEM.[DESC]

My feeble attempt(s) at LINQ:

    Dim s = From items In db.ICITEMs
    Where items.ITEMNO.Contains(Me.txtQuery.Text) Or items.DESC.Contains(Me.txtQuery.Text)
    Join recDates In db.PORCPLs On items.ITEMNO Equals recDates.ITEMNO
    Select [Item_ID] = items.ITEMNO, [Description] = items.DESC, [rd] = recDates.DTARRIVAL

My LINQ Log...

SELECT [t0].[ITEMNO] AS [Item_ID], [t0].[DESC] AS [Description], [t1].[DTARRIVAL] AS [rd]
FROM [dbo].[ICITEM] AS [t0]
INNER JOIN [dbo].[PORCPL] AS [t1] ON [t0].[ITEMNO] = [t1].[ITEMNO]
WHERE ([t0].[ITEMNO] LIKE @p0) OR ([t0].[DESC] LIKE @p1)
-- @p0: Input VarChar (Size = 8000; Prec = 0; Scale = 0) [%r001%]
-- @p1: Input VarChar (Size = 8000; Prec = 0; Scale = 0) [%r001%]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1

I can't figure out how to get a Max function on the [rd] field... ANY insight would be most appreciated.


Solution

  • You need to add a Group By. Here is an example which should help:

    Dim s = From items In db.ICITEMs
    Where items.ITEMNO.Contains(Me.txtQuery.Text) Or items.DESC.Contains(Me.txtQuery.Text)
    Join recDates In db.PORCPLs On items.ITEMNO Equals recDates.ITEMNO
    Group By items.ITEMNO, items.DESC Into MaxArrivalDate = Max(recDates.DTARRIVAL)
    Select [Item_ID] = items.ITEMNO, [Description] = items.DESC, [rd] = MaxArrivalDate