Скомпилированный запрос LINQ не будет выполнен - ​​ArgumentNulException не обработан - PullRequest
1 голос
/ 07 февраля 2011

Я впервые тестирую скомпилированные запросы.

Мой текущий запрос:

 Shared compiledLatestDate As Func(Of RackJobbingDataDataContext, ArtikelInfoParameters, List(Of VerdelingPlanning)) = _
    CompiledQuery.Compile(Of RackJobbingDataDataContext, ArtikelInfoParameters, List(Of VerdelingPlanning))( _
        Function(db As RackJobbingDataDataContext, param As ArtikelInfoParameters) _
          (From verdplan As VerdelingPlanning In db.VerdelingPlannings _
          Join artPlan As ArtikelPlanning In db.ArtikelPlannings _
          On artPlan.VerdelingPlanningID Equals verdplan.VerdelingPlanningID _
          Join levDet As LeveringDetail In db.LeveringDetails _
          On levDet.ArtikelPlanningID Equals artPlan.ArtikelPlanningID _
          Join lev As Levering In db.Leverings _
          On lev.LeveringID Equals levDet.LeveringID _
          Where artPlan.ArtikelID.Equals(param.artId) _
          And lev.WinkelID.Equals(param.winkId) _
          And Not levDet.PlanningAantal.Equals(Nothing) _
          And levDet.PlanningAantal <> 0 _
          And verdplan.Datum < param.datumVerdeling _
          Order By verdplan.Datum Descending _
        Select levDet))

Но я получаю исключение ArgumentNulException.

Для запросов LINQ было рекомендовано добавить объект с необходимыми параметрами, так что это класс:

Public Class ArtikelInfoParameters
Private _wkId As Guid
Private _artId As Guid
Private _datumVerdeling As DateTime
Public Sub New(ByVal artId As Guid, ByVal winkId As Guid, ByVal datumVerdeling As DateTime)
    _artId = artId
    _wkId = winkId
    _datumVerdeling = datumVerdeling
End Sub
Public Property artId As Guid
    Get
        Return _artId
    End Get
    Set(ByVal value As Guid)
        _artId = value
    End Set
End Property
Public Property winkId As Guid
    Get
        Return _wkId
    End Get
    Set(ByVal value As Guid)
        _wkId = value
    End Set
End Property
Public Property datumVerdeling As DateTime
    Get
        Return _datumVerdeling
    End Get
    Set(ByVal value As DateTime)
        _datumVerdeling = value
    End Set
End Property
End Class

И ради полноты, это ошибка, которую я получаю.

  bij System.Data.Linq.SqlClient.SqlJoin.set_Left(SqlSource value)
  bij System.Data.Linq.SqlClient.SqlMultiplexer.Visitor.VisitMultiset(SqlSubSelect sms)
  bij System.Data.Linq.SqlClient.SqlVisitor.VisitSubSelect(SqlSubSelect ss)
  bij System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)
  bij System.Data.Linq.SqlClient.SqlVisitor.VisitExpression(SqlExpression exp)
  bij System.Data.Linq.SqlClient.SqlMultiplexer.Visitor.VisitSelect(SqlSelect select)
  bij System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)
  bij System.Data.Linq.SqlClient.SqlProvider.BuildQuery(ResultShape resultShape, Type resultType, SqlNode node, ReadOnlyCollection`1 parentParameters, SqlNodeAnnotations annotations)
  bij System.Data.Linq.SqlClient.SqlProvider.BuildQuery(Expression query, SqlNodeAnnotations annotations)
  bij System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Compile(Expression query)
  bij System.Data.Linq.CompiledQuery.ExecuteQuery(DataContext context, Object[] args)
  bij System.Data.Linq.CompiledQuery.Invoke[TArg0,TArg1,TResult](TArg0 arg0, TArg1 arg1)
  bij RackJobbing.UI.ucArtikelInfo.getLatestDate(Guid artikelId) in D:\EasySolutions\TFS\Provoost\Development\RackJobbing\RackJobbing.UI\Snelinvoer\Verdeling\ucArtikelInfo.vb:regel 69
  bij RackJobbing.UI.ucArtikelInfo.UpdateInfo() in D:\EasySolutions\TFS\Provoost\Development\RackJobbing\RackJobbing.UI\Snelinvoer\Verdeling\ucArtikelInfo.vb:regel 111
  bij RackJobbing.UI.frmPrePlanning.UcVerdeling1_ArtikelWinkelChanged() in D:\EasySolutions\TFS\Provoost\Development\RackJobbing\RackJobbing.UI\Snelinvoer\Verdeling\frmPrePlanning.vb:regel 280
  bij RackJobbing.UI.ucVerdeling.grdVerdeling_EnterCell(Object sender, EventArgs e) in D:\EasySolutions\TFS\Provoost\Development\RackJobbing\RackJobbing.UI\Snelinvoer\Verdeling\ucVerdeling.vb:regel 339
  bij C1.Win.C1FlexGrid.C1FlexGridBase.OnEnterCell(EventArgs e)
  bij C1.Win.C1FlexGrid.C1FlexGridBase.a9()
  bij C1.Win.C1FlexGrid.C1FlexGridBase.OnGridChanged(Object sender, GridChangedEventArgs e)
  bij C1.Win.C1FlexGrid.C1FlexGrid.OnGridChanged(Object sender, GridChangedEventArgs e)
  bij C1.Win.C1FlexGrid.t.bc(GridChangedTypeEnum A_0, Int32 A_1, Int32 A_2, Int32 A_3, Int32 A_4)
  bij C1.Win.C1FlexGrid.t.bn(GridChangedTypeEnum A_0)
  bij C1.Win.C1FlexGrid.p.n(C1FlexGridBase A_0, CellRange A_1, Boolean A_2)
  bij C1.Win.C1FlexGrid.C1FlexGridBase.Select(CellRange rg, Boolean show)
  bij C1.Win.C1FlexGrid.ab.o(MouseEventArgs A_0)
  bij C1.Win.C1FlexGrid.ab.l(MouseEventArgs A_0)
  bij C1.Win.C1FlexGrid.C1FlexGridBase.OnMouseDown(MouseEventArgs e)
  bij System.Windows.Forms.Control.WmMouseDown(Message& m, MouseButtons button, Int32 clicks)
  bij System.Windows.Forms.Control.WndProc(Message& m)
  bij C1.Win.C1FlexGrid.Util.BaseControls.ScrollableControl.WndProc(Message& m)
  bij System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
  bij System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
  bij System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
  bij System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
  bij System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
  bij System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
  bij System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
  bij System.Windows.Forms.Application.Run(ApplicationContext context)
  bij Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
  bij Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
  bij Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
  bij RackJobbing.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:regel 81
  bij System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
  bij System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
  bij Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
  bij System.Threading.ThreadHelper.ThreadStart_Context(Object state)
  bij System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
  bij System.Threading.ThreadHelper.ThreadStart()

Буду признателен за любую помощь в решении моей проблемы, потому что я действительно не могу найти решение: (

Ответы [ 2 ]

0 голосов
/ 08 февраля 2011

Решение:

Public Shared CompiledLatestDate As Func(Of RackJobbingDataDataContext, ArtikelInfoParameters, IQueryable(Of VerdelingPlanning)) = _
   CompiledQuery.Compile(Function(db As RackJobbingDataDataContext, artInfo As ArtikelInfoParameters) _
        From verdplan As VerdelingPlanning In db.VerdelingPlannings _
              Join artPlan As ArtikelPlanning In db.ArtikelPlannings _
              On verdplan.VerdelingPlanningID Equals artPlan.VerdelingPlanningID _
              Join levDet As LeveringDetail In db.LeveringDetails _
              On artPlan.ArtikelPlanningID Equals levDet.ArtikelPlanningID _
              Join lev As Levering In db.Leverings _
              On levDet.LeveringID Equals lev.LeveringID _
              Where artPlan.ArtikelID.Equals(artInfo.artId) _
              And lev.WinkelID.Equals(artInfo.winkId) _
              And Not levDet.PlanningAantal.Equals(Nothing) _
              And levDet.PlanningAantal <> 0 _
              And verdplan.Datum < artInfo.datumVerdeling _
              Order By verdplan.Datum Descending _
            Select verdplan)

Решил почти все мои проблемы, хотя иногда я получаю исключение NullReferenceException, когда в коллекции нет значения (оно не всегда выдает ошибку, поэтому явсе еще смотрю на это).

0 голосов
/ 07 февраля 2011

В отличие от SQL, левая и правая части предложения ON имеют различную видимость области действия.

Вам нужно поместить переменные, которые находились в области видимости перед JOIN, в левой части предложения ON, а переменные, которые недавно были в области видимости из JOIN, находятся справа.

Здесь я переключил переменные в предложениях ON.

From verdplan As VerdelingPlanning In db.VerdelingPlannings _
  Join artPlan As ArtikelPlanning In db.ArtikelPlannings _
  On verdplan.VerdelingPlanningID Equals artPlan.VerdelingPlanningID _
  Join levDet As LeveringDetail In db.LeveringDetails _
  On artPlan.ArtikelPlanningID Equals levDet.ArtikelPlanningID _
  Join lev As Levering In db.Leverings _
  On levDet.LeveringID Equals lev.LeveringID _
...