Well this may not be pretty, but here is one way to get the typed result that I think you want.
Instead of directly calling abc.Sum(..) in the query, "abc" is passed to a function (TallyObjects in this example) to select the properly typed Sum method. I created a simple test DataTable to demonstrate the technique, It does not match your table schema, but hopefully you will be understand the technique used. Feel free to ask questions.
Private Sub Test()
' create a DataTable with data to test
Dim dt As New DataTable()
With dt
.Columns.Add("c1", GetType(String))
.Columns.Add("OSQnty", GetType(Double))
.Rows.Add(New Object() {"a4", 23})
.Rows.Add(New Object() {"a2", 7})
.Rows.Add(New Object() {"a2", 7})
.Rows.Add(New Object() {"a1", 30})
.AcceptChanges()
End With
GetQueryResult(dt) ' simulate calling OP's method
End Sub 'Test
Private Sub GetQueryResult(ByVal dt As DataTable)
Dim results As IEnumerable = _
(From r In dt.AsEnumerable() _
Order By r("c1") _
Group By col = r("c1") Into abc = Group _
Select New With {.Name = col, .Tally = TallyObjects(abc, "OSQnty")}).ToList
DataGridView1.DataSource = results
End Sub 'GetQueryResult
Private Function TallyObjects(ByVal rows As IEnumerable(Of DataRow), ByVal columnname As String) As Object
Dim ret As Object = Nothing
If rows.Count > 0 Then
' select the sumation function based on the DataType of OSQnty
Select Case Type.GetTypeCode(rows(0)("OSQnty").GetType)
Case TypeCode.Double
ret = rows.Sum(Function(dr As DataRow) CDbl(dr.Item(columnname)))
Case TypeCode.Int32
ret = rows.Sum(Function(dr As DataRow) CInt(dr.Item(columnname)))
' add a "Case" for any other sumable types you may need
End Select
End If
Return ret
End Function 'TallyObjects