C# LINQ查询引发空引用异常

C# LINQ查询引发空引用异常,c#,vb.net,linq,entity-framework,linq-to-sql,C#,Vb.net,Linq,Entity Framework,Linq To Sql,我正在使用LINQ查询填充数据网格。作为新增强的一部分,我必须通过在WHERE子句中包含更多的条件来更改现有的LINQ查询。 看了这么多的帖子,觉得条款条件很简单。 之前的查询返回简单对象类型(匿名),工作正常。 现在,我将查询分为两部分。在第一部分中,我尝试返回已知类型,并在下一部分中尝试堆栈where子句。 但有些人认为这是行不通的,也没有取得任何结果。它正在网格上引发NULL引用异常。DataBind正在引发异常(NULL引用异常) 在这里发布我的代码 Using db As New Pr

我正在使用LINQ查询填充数据网格。作为新增强的一部分,我必须通过在WHERE子句中包含更多的条件来更改现有的LINQ查询。 看了这么多的帖子,觉得条款条件很简单。 之前的查询返回简单对象类型(匿名),工作正常。 现在,我将查询分为两部分。在第一部分中,我尝试返回已知类型,并在下一部分中尝试堆栈where子句。 但有些人认为这是行不通的,也没有取得任何结果。它正在网格上引发NULL引用异常。DataBind正在引发异常(NULL引用异常) 在这里发布我的代码

Using db As New ProjectDataContext
        Dim orderLines As IEnumerable(Of orderline)
        Dim customOrderLines As Object
        Try
            If VATSearch = 1 Then
                ' Show only VAT orders
                'orderlines = (From O In db.orderlines Where O.order.order_date > MinTime And O.order.order_date < MaxTime And O.order.order_status_fk > 1 And (O.ol_vat_free Is Nothing OrElse O.ol_vat_free = 0) Order By O.order.order_date _
                '        Select OrderLineID = O.ol_id, Ref = O.order.order_ref, Email = CStr(IIf(O.order.User Is Nothing, O.order.order_billing_email, O.order.User.user_email)), Code = O.StockItem.productsbycolor.product.product_code & O.StockItem.productsbycolor.color.color_code, Size = O.size.size_code, Qty = O.ol_qty, Price = O.ol_product_price, LineTotal = O.ol_lineprice, Delivery = (O.order.order_delivery_total / O.order.orderlines.Count), NonVAT = O.order.order_vat_free _
                '            )
                orderLines = (From o In db.orderlines Where o.order.order_date > MinTime And o.order.order_date < MaxTime And o.order.order_status_fk > 1 And (o.ol_vat_free Is Nothing OrElse o.ol_vat_free = 0) Order By o.order.order_date _
                Select o)


            ElseIf VATSearch = 2 Then
                ' Show only non-VAT orders
                'orderlines = (From O In db.orderlines Where O.order.order_date > MinTime And O.order.order_date < MaxTime And O.order.order_status_fk > 1 And (Not O.ol_vat_free Is Nothing) AndAlso O.ol_vat_free = 1 Order By O.order.order_date _
                '    Select OrderLineID = O.ol_id, Ref = O.order.order_ref, Email = CStr(IIf(O.order.User Is Nothing, O.order.order_billing_email, O.order.User.user_email)), Code = O.StockItem.productsbycolor.product.product_code & O.StockItem.productsbycolor.color.color_code, Size = O.size.size_code, Qty = O.ol_qty, Price = O.ol_product_price, LineTotal = O.ol_lineprice, Delivery = (O.order.order_delivery_total / O.order.orderlines.Count), NonVAT = O.order.order_vat_free _
                '                )
                orderLines = (From O In db.orderlines Where O.order.order_date > MinTime And O.order.order_date < MaxTime And O.order.order_status_fk > 1 And (Not O.ol_vat_free Is Nothing) AndAlso O.ol_vat_free = 1 Order By O.order.order_date _
                        Select O)
            Else
                ' Show both VAT and non-VAT orders
                'orderlines = (From O In db.orderlines Where O.order.order_date > MinTime And O.order.order_date < MaxTime And O.order.order_status_fk > 1 Order By O.order.order_date _
                '   Select OrderLineID = O.ol_id, Ref = O.order.order_ref, Email = CStr(IIf(O.order.User Is Nothing, O.order.order_billing_email, O.order.User.user_email)), Code = O.StockItem.productsbycolor.product.product_code & O.StockItem.productsbycolor.color.color_code, Size = O.size.size_code, Qty = O.ol_qty, Price = O.ol_product_price, LineTotal = O.ol_lineprice, Delivery = (O.order.order_delivery_total / O.order.orderlines.Count), NonVAT = O.order.order_vat_free _
                '            )
                orderLines = (From o In db.orderlines Where o.order.order_date > MinTime And o.order.order_date < MaxTime And o.order.order_status_fk > 1 Order By o.order.order_date _
                        Select o)
            End If

            customOrderLines = (From o In orderLines
                        Select orderLineID = o.ol_id, ref = o.order.order_ref, email = CStr(IIf(o.order.User Is Nothing, o.order.order_billing_email, o.order.User.user_email)),
                        code = o.StockItem.productsbycolor.product.product_code & o.StockItem.productsbycolor.color.color_code,
                        size = o.size.size_code, qty = o.ol_qty, price = o.ol_product_price, lineTotal = o.ol_lineprice,
                        delivery = (o.order.order_delivery_total / o.order.orderlines.Count), nonVAT = o.order.order_vat_free, orderPaymentType = o.order.order_google_order_number)

            results.DataSource = customOrderLines
            results.DataBind()
            results.Visible = True
            btnExportButton.Visible = True

        Catch ex As Exception

        End Try
    End Using
使用db作为新的ProjectDataContext
将订单行标注为IEnumerable(订单行的)
将自定义医嘱行作为对象
尝试
如果VATSearch=1,则
'仅显示增值税订单
'orderlines=(从db.orderlines中的O开始,其中O.order.order\u date>MinTime和O.order.order\u date1和(O.ol\u vat\u free为零或O.ol\u vat\u free=0)按O.order.order\u date订购_
'选择OrderLineID=O.ol\U id,Ref=O.order.order\U Ref,Email=CStr(IIf(O.order.User什么都不是,O.order.order\u billing\u Email,O.order.User.User\u Email)),Code=O.StockItem.productsbycolor.product.product\u Code&O.StockItem.productsbycolor.color.color\u Code,Size=O.Size.Size\u Code,Qty=O.ol\u Qty,Price=O.ol\u product\u Price,LineTotal=O.ol\u lineprice,Delivery=(O.order.order\u Delivery\u total/O.orderlines.Count),NOVAT=O.order.order\u免增值税_
'            )
orderLines=(从db.orderLines中的o开始,其中o.order.order\u date>MinTime和o.order.order\u date1和(o.ol\u vat\u free为零或o.ol\u vat\u free=0)按o.order.order\u date订购_
选择o)
ElseIf VATSearch=2,则
'仅显示非增值税订单
'orderlines=(从db.orderlines中的O开始,其中O.order.order\u date>MinTime和O.order.order\u date1和(非O.ol\u vat\u free不算什么)以及O.ol\u vat\u free=1按O.order.order\u date订购_
'选择OrderLineID=O.ol\U id,Ref=O.order.order\U Ref,Email=CStr(IIf(O.order.User什么都不是,O.order.order\u billing\u Email,O.order.User.User\u Email)),Code=O.StockItem.productsbycolor.product.product\u Code&O.StockItem.productsbycolor.color.color\u Code,Size=O.Size.Size\u Code,Qty=O.ol\u Qty,Price=O.ol\u product\u Price,LineTotal=O.ol\u lineprice,Delivery=(O.order.order\u Delivery\u total/O.orderlines.Count),NOVAT=O.order.order\u免增值税_
'                )
orderLines=(从db.orderLines中的O开始,其中O.order.order\u date>MinTime和O.order.order\u date1和(非O.ol\u vat\u free为零)以及O.ol\u vat\u free=1个订单,按O.order.order\u date_
选择O)
其他的
'显示增值税和非增值税订单
'orderlines=(从db.orderlines中的O开始,其中O.order.order\u date>MinTime和O.order.order\u date1 order By O.order\u date_
'选择OrderLineID=O.ol\U id,Ref=O.order.order\U Ref,Email=CStr(IIf(O.order.User什么都不是,O.order.order\u billing\u Email,O.order.User.User\u Email)),Code=O.StockItem.productsbycolor.product.product\u Code&O.StockItem.productsbycolor.color.color\u Code,Size=O.Size.Size\u Code,Qty=O.ol\u Qty,Price=O.ol\u product\u Price,LineTotal=O.ol\u lineprice,Delivery=(O.order.order\u Delivery\u total/O.orderlines.Count),NOVAT=O.order.order\u免增值税_
'            )
orderLines=(从db.orderLines中的o开始,其中o.order.order\u date>MinTime和o.order.order\u date1 order By o.order.order\u date_
选择o)
如果结束
customOrderLines=(从订单行中的o开始)
选择orderLineID=o.ol\u id,ref=o.order.order\u ref,email=CStr(IIf(o.order.User什么都不是,o.order.order\u billing\u email,o.order.User.User\u email)),
代码=o.StockItem.productsbycolor.product.product\u代码&o.StockItem.productsbycolor.color.color\u代码,
尺寸=o.size.size\U代码,数量=o.ol\U数量,价格=o.ol\U产品价格,lineTotal=o.ol\U lineprice,
交货=(o.order.order\u delivery\u total/o.order.orderlines.Count),NOVAT=o.order.order\u vat\u free,orderPaymentType=o.order.order\u google\u order\u number)
results.DataSource=customOrderLines
results.DataBind()
results.Visible=True
btnExportButton.Visible=True
特例
结束尝试
终端使用

选择后使用new after select创建匿名类型并将其括在大括号中

customOrderLines = (From o In orderLines
                    Select new { orderLineID = o.ol_id, ref = o.order.order_ref, email = CStr(IIf(o.order.User Is Nothing, o.order.order_billing_email, o.order.User.user_email)),
                    code = o.StockItem.productsbycolor.product.product_code & o.StockItem.productsbycolor.color.color_code,
                    size = o.size.size_code, qty = o.ol_qty, price = o.ol_product_price, lineTotal = o.ol_lineprice,
                    delivery = (o.order.order_delivery_total / o.order.orderlines.Count), nonVAT = o.order.order_vat_free, orderPaymentType = o.order.order_google_order_number})

我希望这会有所帮助。

您收到的错误表明您尝试运行的
LINQ
没有返回任何值,因此
customOrderLines
将作为空集合返回。由于
LINQ
包含许多过滤器,我建议删除
Dim customOrderLines As Object
,改为执行以下操作:

Dim customOrderLines = (From o In orderLines 
  Select orderLineID = o.ol_id, ref = o.order.order_ref, 
  email = CStr(IIf(o.order.User Is Nothing, o.order.order_billing_email, o.order.User.user_email)), 
  code = o.StockItem.productsbycolor.product.product_code & o.StockItem.productsbycolor.color.color_code, 
  size = o.size.size_code, qty = o.ol_qty, price = o.ol_product_price, lineTotal = o.ol_lineprice, 
  delivery = (o.order.order_delivery_total / o.order.orderlines.Count), nonVAT = o.order.order_vat_free, 
  orderPaymentType = o.order.order_google_order_number)

if customOrderLines isnot nothing andalso customOrderLines.Any then
  results.DataSource = customOrderLines 
  results.DataBind() 
  results.Visible = True 
  btnExportButton.Visible = True
else
  results.DataSource = nothing
  results.DataBind()
  results.Visible = False
  btnExportButton.Visible = False
end if
这将确保您不会尝试绑定空集合,而且如果
LINQ
没有返回任何内容,它也会清除您的
datagrid

但主要问题仍然是,您的
LINQ
正在返回一个空集合。我主要建议返回,并确保
LINQ
实际上是使用LINQpad或其他类似的实用程序返回您所期望的


您可以获取LinqPad。

我收到错误,因为我使用IIF进行空检查

有时它会返回nul
var allHeights = MyCities.SelectMany(city => 
    city.Houses.SelectMany(h => 
        h.Storeys.Values.Select(s => new { City = city, House = h, Storey = s })))
   .GroupBy(g => g.Storey.Height)
   .OrderBy(heightGroup => heightGroup.Key)
   .ToList();
int i = 0;
foreach (var heightGroup in allHeights)
{
    if (i > 1)
    {
        var previousHeightGroup = allHeights[i-1].ToList();
        var previousPartIDs = previousHeightGroup.Select(g => g?.City?.Name).ToList();
        //.... <do stuff in case of i > 0>
    }
    // do other stuff
    i++;
}
.Select(g => {
   var group = g;
   var city = g?.City;
   var cityName = city?.Name;
   return cityName;
})