asp.net 核心 Enum Nullable 对象必须有一个值
asp.net core Enum Nullable object must have a value
我有以下 enum
:
public enum EventType
{
LoginSuccessfully = 1,
LoginFailure = 2,
UserCreated = 3,
UnableToCreateUser = 4,
PasswordReseted = 5,
UnableToResetPassword = 6,
UserDeleted = 7,
UnableToDeleteUser = 8
}
我有这个方法:
public IActionResult GetFilteredLogs([FromBody] SearchFilterContract contract)
{
//filter logs from database
}
这是从我的方法收到的 contract
parameter
:
public class SearchFilterContract
{
public EventType? EventTypes { get; set; }
public string Username { get; set; }
public DateTime? fromDate { get; set; }
public DateTime? toDate { get; set; }
public int pageSize { get; set; }
public int pageNumber {get; set;}
}
如果 contract
中的所有值都是 Null
它会从数据库中获取所有值。
在我的方法中我比较了合约的变量
public SearchStatementSource(int? EventId,string username,DateTime? fromDate,DateTime? toDate,int pageSize, int PageNumber)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("SELECT * FROM [dbo].[eventslog] ");
if(username != null)
{
sb.AppendLine("WHERE Username = @Username ");
}
else
{
sb.AppendLine("WHERE Username IS NOT NULL ");
}
if(fromDate.HasValue)
{
sb.AppendLine("AND CreatedTime >= @fromDate ");
}
if(toDate.HasValue)
{
sb.AppendLine("AND CreatedTime <= @toDate ");
}
if(EventId.HasValue)
{
sb.AppendLine("AND EventId = @EventId ");
}
sb.AppendLine("AND Id >=" + startingIndex);
sb.AppendLine("AND Id <=" + finalIndex);
_command = sb.ToString();
Parameters.Add(new SqlParameter("@null","null"));
AddNullable("@Username", username);
AddNullable("@EventId", EventId);
AddNullable("@fromDate", fromDate);
AddNullable("@toDate",toDate);
情报? EventId是从枚举中收到的数字
这是我的控制器方法:
[HttpPost]
[Route("[action]")]
[AllowAnonymous]
public IActionResult GetFilteredLogs([FromBody] SearchFilterContract contract)
{
try
{
List<EventsLog> eventsLog = _logsBl.SearchLogs(contract.EventTypes,contract.Username,contract.fromDate,contract.toDate,contract.pageNumber,contract.pageSize);
return Ok(eventsLog);
}
catch(Exception ex)
{
return BadRequest(ex);
}
}
这是我的 DataRepository 方法
public List<EventsLog> SearchLogs(EventType? EventId, string username, DateTime? fromDate, DateTime? toDate,int pageSize, int pageNumber)
{
List<EventsLog> logs = new List<EventsLog>();
DataTable dt = Select(new SearchStatementSource((int)EventId,username,fromDate,toDate,pageSize,pageNumber));
foreach(DataRow dr in dt.Rows)
{
logs.Add(Map(dr));
}
return logs;
}
在Repository方法上调用SearchStatementSource
方法时抛出异常
我的问题是,当我将 EventTypes
设为 Null 时 returns 出现以下错误:
"Nullable object must have a value"
关于如何解决这个问题有什么想法吗?
你必须检查所有你使用的地方EventTypes.Value
那是因为您正在访问空对象的 Value
属性
你先这样查:
if(obj.EventTypes.HasValue)
//Do your logic
或者,如果您使用的是 C# 6,则可以使用此
obj.EventTypes ?? DefaultValue
更新:
你的问题在这里:
DataTable dt = Select(new SearchStatementSource((int)EventId, username, [...]
当 EventId
可以为 null 时,您将其转换为 int
改为(int?)EventId
DataTable dt = Select(new SearchStatementSource((int?)EventId, username, [...]
我有以下 enum
:
public enum EventType
{
LoginSuccessfully = 1,
LoginFailure = 2,
UserCreated = 3,
UnableToCreateUser = 4,
PasswordReseted = 5,
UnableToResetPassword = 6,
UserDeleted = 7,
UnableToDeleteUser = 8
}
我有这个方法:
public IActionResult GetFilteredLogs([FromBody] SearchFilterContract contract)
{
//filter logs from database
}
这是从我的方法收到的 contract
parameter
:
public class SearchFilterContract
{
public EventType? EventTypes { get; set; }
public string Username { get; set; }
public DateTime? fromDate { get; set; }
public DateTime? toDate { get; set; }
public int pageSize { get; set; }
public int pageNumber {get; set;}
}
如果 contract
中的所有值都是 Null
它会从数据库中获取所有值。
在我的方法中我比较了合约的变量
public SearchStatementSource(int? EventId,string username,DateTime? fromDate,DateTime? toDate,int pageSize, int PageNumber)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("SELECT * FROM [dbo].[eventslog] ");
if(username != null)
{
sb.AppendLine("WHERE Username = @Username ");
}
else
{
sb.AppendLine("WHERE Username IS NOT NULL ");
}
if(fromDate.HasValue)
{
sb.AppendLine("AND CreatedTime >= @fromDate ");
}
if(toDate.HasValue)
{
sb.AppendLine("AND CreatedTime <= @toDate ");
}
if(EventId.HasValue)
{
sb.AppendLine("AND EventId = @EventId ");
}
sb.AppendLine("AND Id >=" + startingIndex);
sb.AppendLine("AND Id <=" + finalIndex);
_command = sb.ToString();
Parameters.Add(new SqlParameter("@null","null"));
AddNullable("@Username", username);
AddNullable("@EventId", EventId);
AddNullable("@fromDate", fromDate);
AddNullable("@toDate",toDate);
情报? EventId是从枚举中收到的数字
这是我的控制器方法:
[HttpPost]
[Route("[action]")]
[AllowAnonymous]
public IActionResult GetFilteredLogs([FromBody] SearchFilterContract contract)
{
try
{
List<EventsLog> eventsLog = _logsBl.SearchLogs(contract.EventTypes,contract.Username,contract.fromDate,contract.toDate,contract.pageNumber,contract.pageSize);
return Ok(eventsLog);
}
catch(Exception ex)
{
return BadRequest(ex);
}
}
这是我的 DataRepository 方法
public List<EventsLog> SearchLogs(EventType? EventId, string username, DateTime? fromDate, DateTime? toDate,int pageSize, int pageNumber)
{
List<EventsLog> logs = new List<EventsLog>();
DataTable dt = Select(new SearchStatementSource((int)EventId,username,fromDate,toDate,pageSize,pageNumber));
foreach(DataRow dr in dt.Rows)
{
logs.Add(Map(dr));
}
return logs;
}
在Repository方法上调用SearchStatementSource
方法时抛出异常
我的问题是,当我将 EventTypes
设为 Null 时 returns 出现以下错误:
"Nullable object must have a value"
关于如何解决这个问题有什么想法吗?
你必须检查所有你使用的地方EventTypes.Value
那是因为您正在访问空对象的 Value
属性
你先这样查:
if(obj.EventTypes.HasValue)
//Do your logic
或者,如果您使用的是 C# 6,则可以使用此
obj.EventTypes ?? DefaultValue
更新:
你的问题在这里:
DataTable dt = Select(new SearchStatementSource((int)EventId, username, [...]
当 EventId
可以为 null 时,您将其转换为 int
改为(int?)EventId
DataTable dt = Select(new SearchStatementSource((int?)EventId, username, [...]