List.contains 抛出 null 异常?
List.contains throwing null exception?
我有一个像
这样的连接查询
public ActionResult Import(int[] userValue, int[] provalue, DateTime? StartDate, DateTime? EndDate)
{
List<int> actallid = db.Activitys.Select(x=>x.ID).ToList();
List<int> actchild = FileOperation.ChildActivity(actallid);
DateTime Start_Date = Convert.ToDateTime(StartDate);
DateTime End_Date = Convert.ToDateTime(EndDate);
IEnumerable<ViewModelActivitySearch> search = from r in db.Reports
join a in db.Activitys on r.ID equals a.Report_ID
join u in db.Users on r.Users_ID equals u.ID
join p in db.Projects on a.Projects_ID equals p.ID
join act in db.ActivityTypes on a.Activity_Type_ID equals act.ID
where (
(r.Start_Date == StartDate || r.End_Date == EndDate || userValue.Contains((int)r.Users_ID) || provalue.Contains((int)a.Projects_ID))
&&
//status is submitted=2, approved=3,exclude child activities
(!actchild.Contains((int)a.ID))
&&
(r.Status == 2 || r.Status == 3)
)
select new ViewModelActivitySearch
{
Id = a.ID,
Activity_Text = a.Activity_Text,
Deliverable = a.Deliverable,
Employee = string.Concat(u.FirstName, " ", u.LastName),
Start_Date = r.Start_Date,
End_Date = r.End_Date,
Activity_Date = a.Activity_Date,
Project = p.Name,
category = act.Activity_Type
};
BindProjectAndUser();
return View(search.ToList());
}
我有一个搜索页面,用户可以在其中输入开始日期、结束日期、选择用户和选择项目。
然后我进行了连接查询以根据该变量获取所有数据。
问题是当用户没有选择任何用户或项目时
代码
userValue.Contains((int)r.Users_ID) || provalue.Contains((int)a.Projects_ID))
报错
Unable to create a null constant value of type 'System.Int32[]'. Only entity types, enumeration types or primitive types are supported in this context.
除了contains,我还能用什么来避免这个错误。
谢谢
始终进行服务器端验证!
特别是如果您将用户输入用于 SQL 语句,验证它非常重要(sql 注入 )!
最简单的方法:if 语句
if(userinput == null){
return View();
}
注意:如果您使用 Convert.ToDateTime()
,如果提供的 DateTime 为 null,则不会出现异常。您将得到 DateTime.MinValue,这可能会导致意想不到的结果。
在使用 Contains:
之前,检查您尝试使用三元运算符显式转换为 int(如 r.Users_ID)的值中的空值
where (r.Start_Date == StartDate || r.End_Date == EndDate ||
r.Users_ID != null? userValue.Contains((int)r.Users_ID) : false ||
a.Projects_ID != null ?provalue.Contains((int)a.Projects_ID) : false)
方法 Contains() 是一种检查相同类型的值列表中是否存在特定值的方法,在这里使用它非常合适。
我有一个像
这样的连接查询 public ActionResult Import(int[] userValue, int[] provalue, DateTime? StartDate, DateTime? EndDate)
{
List<int> actallid = db.Activitys.Select(x=>x.ID).ToList();
List<int> actchild = FileOperation.ChildActivity(actallid);
DateTime Start_Date = Convert.ToDateTime(StartDate);
DateTime End_Date = Convert.ToDateTime(EndDate);
IEnumerable<ViewModelActivitySearch> search = from r in db.Reports
join a in db.Activitys on r.ID equals a.Report_ID
join u in db.Users on r.Users_ID equals u.ID
join p in db.Projects on a.Projects_ID equals p.ID
join act in db.ActivityTypes on a.Activity_Type_ID equals act.ID
where (
(r.Start_Date == StartDate || r.End_Date == EndDate || userValue.Contains((int)r.Users_ID) || provalue.Contains((int)a.Projects_ID))
&&
//status is submitted=2, approved=3,exclude child activities
(!actchild.Contains((int)a.ID))
&&
(r.Status == 2 || r.Status == 3)
)
select new ViewModelActivitySearch
{
Id = a.ID,
Activity_Text = a.Activity_Text,
Deliverable = a.Deliverable,
Employee = string.Concat(u.FirstName, " ", u.LastName),
Start_Date = r.Start_Date,
End_Date = r.End_Date,
Activity_Date = a.Activity_Date,
Project = p.Name,
category = act.Activity_Type
};
BindProjectAndUser();
return View(search.ToList());
}
我有一个搜索页面,用户可以在其中输入开始日期、结束日期、选择用户和选择项目。 然后我进行了连接查询以根据该变量获取所有数据。 问题是当用户没有选择任何用户或项目时 代码
userValue.Contains((int)r.Users_ID) || provalue.Contains((int)a.Projects_ID))
报错
Unable to create a null constant value of type 'System.Int32[]'. Only entity types, enumeration types or primitive types are supported in this context.
除了contains,我还能用什么来避免这个错误。 谢谢
始终进行服务器端验证!
特别是如果您将用户输入用于 SQL 语句,验证它非常重要(sql 注入 )!
最简单的方法:if 语句
if(userinput == null){
return View();
}
注意:如果您使用 Convert.ToDateTime()
,如果提供的 DateTime 为 null,则不会出现异常。您将得到 DateTime.MinValue,这可能会导致意想不到的结果。
在使用 Contains:
之前,检查您尝试使用三元运算符显式转换为 int(如 r.Users_ID)的值中的空值where (r.Start_Date == StartDate || r.End_Date == EndDate ||
r.Users_ID != null? userValue.Contains((int)r.Users_ID) : false ||
a.Projects_ID != null ?provalue.Contains((int)a.Projects_ID) : false)
方法 Contains() 是一种检查相同类型的值列表中是否存在特定值的方法,在这里使用它非常合适。