微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。