在数据库中搜索一个字段可以为空的对象

Search for an object in the database with a field that can be null

我正在尝试通过检查这些字段与它们的本地副本来从 table 中检索对象

Bin(不为空)、IPN(不为空)、Location Id(不为空)、计数日期(不为空)、Lot 标签(可为空)和序列号(可为空)。

如果我不包括批次或序列号,它工作正常 - 它将 return 具有批次标签的对象(在 table 中,您可以拥有许多相同的项目不同的批次标签或序列号),但它永远不会 return 批次 tag/serial 为空的那些

所以我的问题是如何也搜索这些项目?这是代码行。如果我在末尾包含 lot tag/serial 内容,它将为 null。但是如果我删除它,它将 return 一个项目(除了我还需要它 return 在这些字段中包含 null 的项目)。

InventoryPhysicalCount editItem = DatabaseDataContext.InventoryPhysicalCounts.First(i => 
    i.Bin == LocalSelectedItem.Bin && i.IPN == LocalSelectedItem.IPN &&
    i.LocationId == LocalSelectedItem.LocationId &&
    i.CountDate == LocalSelectedItem.CountDate && 
    i.LotTag == LocalSelectedItem.LotTag && 
    i.SerialNumber == LocalSelectedItem.SerialNumber);

谢谢。

如果您想要所有匹配 Not Null 字段并具有 Null 字段或匹配给定值的记录:

InventoryPhysicalCount editItem =   
    DatabaseDataContext.InventoryPhysicalCounts.First(i => 
        i.Bin == LocalSelectedItem.Bin && i.IPN == LocalSelectedItem.IPN &&
        i.LocationId == LocalSelectedItem.LocationId &&
        i.CountDate == LocalSelectedItem.CountDate && 
        (i.LotTag == null || i.LotTag == LocalSelectedItem.LotTag) && 
        (i.SerialNumber == null || i.SerialNumber == LocalSelectedItem.SerialNumber));

如果您想要匹配值的记录(如果没有给出值则为空,如果给出 LocalSelectedItem 值则为值):

InventoryPhysicalCount editItem =   
    DatabaseDataContext.InventoryPhysicalCounts.First(i => 
        i.Bin == LocalSelectedItem.Bin && i.IPN == LocalSelectedItem.IPN &&
        i.LocationId == LocalSelectedItem.LocationId &&
        i.CountDate == LocalSelectedItem.CountDate && 
        ((i.LotTag == null && LocalSelectedItem.LotTag == null) || i.LotTag == LocalSelectedItem.LotTag) && 
        ((i.SerialNumber == null && LocalSelectedItem.SerialNumber == null) || i.SerialNumber == LocalSelectedItem.SerialNumber));

如果您想忽略 LocalSelectedItem 值为 Null 的值:

InventoryPhysicalCount editItem =   
    DatabaseDataContext.InventoryPhysicalCounts.First(i => 
        i.Bin == LocalSelectedItem.Bin && i.IPN == LocalSelectedItem.IPN &&
        i.LocationId == LocalSelectedItem.LocationId &&
        i.CountDate == LocalSelectedItem.CountDate && 
        (LocalSelectedItem.LogTag == null || i.LotTag == LocalSelectedItem.LotTag) && 
        (LocalSelectedItem.SerialNumber == null || i.SerialNumber == LocalSelectedItem.SerialNumber));