C# Where 子句不会 return 来自可空布尔值的空值
C# Where clause won't return the null values from a nullable bool
我有一个可为空的布尔值,它在 SQL 服务器数据库上包含 true / false / null。我正在尝试向服务器查询 return 一个包含错误 FlagForDelete
记录的数据集,另一个 return 空 FlagForDelete
记录。我已经尝试了几种方法,但无法隔离我的目标条件所需的两个数据集。
有人可以提供有关如何完成此操作的提示吗?非常感谢。
目标条件
Dataset1 to contain only false records.
Dataset2 to contain only null records.
我试过下面的代码,但无法正常工作。不管 true/false/null.
我得到所有记录
数据集
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);
在 C# 中,可以为 null 的布尔列将映射到 bool?
;
...Where(ffd => ffd.FlagForDelete == false);
...Where(ffd => !ffd.FlagForDelete.HasValue);
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
},
{
"MaterialID": 3,
"StockQty": 30,
"FlagForDelete": null
}
],
"NotEither": [
{
"MaterialID": 3,
"StockQty": 30,
"FlagForDelete": null
}
],
"Lakemann": [
{
"MaterialID": 3,
"StockQty": 30,
"FlagForDelete": null
}
]
}
我有一个可为空的布尔值,它在 SQL 服务器数据库上包含 true / false / null。我正在尝试向服务器查询 return 一个包含错误 FlagForDelete
记录的数据集,另一个 return 空 FlagForDelete
记录。我已经尝试了几种方法,但无法隔离我的目标条件所需的两个数据集。
有人可以提供有关如何完成此操作的提示吗?非常感谢。
目标条件
Dataset1 to contain only false records.
Dataset2 to contain only null records.
我试过下面的代码,但无法正常工作。不管 true/false/null.
我得到所有记录数据集
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);
在 C# 中,可以为 null 的布尔列将映射到 bool?
;
...Where(ffd => ffd.FlagForDelete == false);
...Where(ffd => !ffd.FlagForDelete.HasValue);
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
},
{
"MaterialID": 3,
"StockQty": 30,
"FlagForDelete": null
}
],
"NotEither": [
{
"MaterialID": 3,
"StockQty": 30,
"FlagForDelete": null
}
],
"Lakemann": [
{
"MaterialID": 3,
"StockQty": 30,
"FlagForDelete": null
}
]
}