List.contains抛出null异常?

时间:2015-07-08 05:20:59

标签: c# asp.net-mvc join lambda 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.

我可以使用什么来代替包含,以便不会出现此错误。 感谢

2 个答案:

答案 0 :(得分:0)

始终进行服务器端验证!

特别是如果您正在使用SQL语句的用户输入,那么验证它是非常重要的( sql injection )!

最简单的方法: if-statements

if(userinput == null){
   return View();
}

注意:如果您使用Convert.ToDateTime(),如果提供的DateTime为 null ,则不会出现异常。您将获得 DateTime.MinValue ,这可能会以意外结果结束。

答案 1 :(得分:0)

在使用Contains之前,检查在尝试使用三元运算符显式转换为int(例如r.Users_ID)的值中为null:

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()是一种方法,用于检查相同类型的值列表中是否存在某个值,并且在此处使用它是完全正确的。