C#Where子句不会从可为null的布尔中返回null值

问题描述

我有一个可空布尔,它在sql Server数据库上包含true / false / null。我正在尝试查询服务器以返回包含错误FlagForDelete记录的数据集和另一个返回空的FlagForDelete记录的数据集。我已经尝试了几件事,但无法隔离目标条件所需的两个数据集。

有人可以提示我如何完成此任务吗?非常感谢。

目标条件

Dataset1 to contain only false records.  
Dataset2 to contain only null records.  

我尝试了以下代码,但无法正常工作。我得到所有记录,无论是真/假/空。

数据集

MaterialID  |   StockQty    |   FlagForDelete
----------------------------------------------
MAT1        |   10          |   true
MAT2        |   20          |   false
MAT3        |   30          |   null

型号

public class Material
{
    public int MaterialID { get; set; } 
    public decimal? StockQty { get; set; }      
    public bool? FlagForDelete { get; set; }     
}

控制器

IQueryable<Material> Dataset1 = _context.Material.AsNoTracking().Where(ffd => ffd.FlagForDelete == false);
IQueryable<Material> Dataset2 = _context.Material.AsNoTracking().Where(ffd => ffd.FlagForDelete == null);

解决方法

Reproduced this with SQL server.
Added your Material class. Correction to you keys were made.
The HasValue as stated was fine. Also Convert.ToBoolean helped with translation. 
Some options for various results have been provided.
 

       [HttpGet]  
       public IActionResult GetNulls()
       {
           List<Material> mats = new List<Material>
           {
               new Material { MaterialID = 1,StockQty = 10,FlagForDelete = true },               new Material { MaterialID = 2,StockQty = 20,FlagForDelete = false },               new Material { MaterialID = 3,StockQty = 30 }
           };
           string Response = "SUCCESS:";
           try
           {
               List<Material> NotFalse = mats.Where(m => m.FlagForDelete != Convert.ToBoolean(false)).ToList();
               List<Material> NotTrue = mats.Where(m => m.FlagForDelete != Convert.ToBoolean(true)).ToList();
               List<Material> NotEither = mats.Where(m => m.FlagForDelete != Convert.ToBoolean(true) &&  m.FlagForDelete != Convert.ToBoolean(false)).ToList();
               List<Material> Lakemann = mats.Where(m => !m.FlagForDelete.HasValue).ToList();
               var combine = new { NotFalse,NotTrue,NotEither,Lakemann };
               var options = new JsonSerializerOptions { WriteIndented = true };
               string json = JsonSerializer.Serialize(combine,options);
               return Ok(json);
           }
           catch (Exception ex)
           {Response = "ERROR: **" + ex.Message;}
           finally
           {};
           return NoContent();
       }

JSON
{
  "NotFalse": [
    {
      "MaterialID": 1,      "StockQty": 10,      "FlagForDelete": true
    },    {
      "MaterialID": 3,      "StockQty": 30,      "FlagForDelete": null
    }
  ],  "NotTrue": [
    {
      "MaterialID": 2,      "StockQty": 20,      "FlagForDelete": false
    },  "NotEither": [
    {
      "MaterialID": 3,  "Lakemann": [
    {
      "MaterialID": 3,      "FlagForDelete": null
    }
  ]
}


,

在C#中,可以为null的布尔列将映射到bool?;

...Where(ffd => ffd.FlagForDelete == false);
...Where(ffd => !ffd.FlagForDelete.HasValue);