public IQueryable SearchUser(DropDownList systemddl, DropDownList membertypeddl, DropDownList stateddl, DropDownList salemanddl, TextBox searchtxt)
        {
            var dc = new DataClassesDataContext();
            var search = searchtxt.Text.Trim();            var list = from m in dc.aspnet_Membership where m.ApplicationId.ToString() != "7DA23851-4337-46B1-BC1D-940FDD05492A" select new { m.aspnet_Applications.ApplicationName, m.UserId, m.aspnet_Users.UserName, m.CreateDate, m.Email, m.IsApproved, m.IsLockedOut, m.LastLoginDate, m.LastLockoutDate, m.aspnet_Users.PublicInfo.SaleMan, m.aspnet_Users.PublicInfo.CorpName };            if (systemddl.SelectedValue != "") //按用户所属网站查找用户
                list = list.Where(p => p.ApplicationName == systemddl.SelectedItem.Text);            if (membertypeddl.SelectedValue != "")//按用户所有权限查找用户
            {
                Guid businessId = new Guid("4D69C73F-25CE-4538-8B3F-01805387B203");
                Guid newsRoleId = new Guid("C5F56C74-20BC-4829-97A5-A4E28A85497D");
                Guid jobRoleId = new Guid("C0209A4F-1F1D-4F92-8338-918ED9216ACF");                if (membertypeddl.SelectedValue == "免费会员")
                {
                    //获取所有收费会员的id
                    var chargelist = dc.aspnet_UsersInRoles.Where(p => (p.RoleId == businessId || p.RoleId == newsRoleId || p.RoleId == jobRoleId) && (p.Expire >= DateTime.Now)).Select(p => p.UserId);
                    list = list.Where(l => !chargelist.Contains(l.UserId));
                }
                else
                {
                    Guid searchRoleId = new Guid(membertypeddl.SelectedValue);
                    var chargelist = dc.aspnet_UsersInRoles.Where(p => (p.RoleId == searchRoleId) && (p.Expire >= DateTime.Now)).Select(p => p.UserId).Take(2000);
                    list = list.Where(l => chargelist.Contains(l.UserId));
                }
            }            if (stateddl.SelectedValue != "")
            {
                if (stateddl.SelectedValue == "1")
                {
                    list = list.Where(u => u.IsApproved == true);
                }
                else if (stateddl.SelectedValue == "0")
                {
                    list = list.Where(u => u.IsApproved == false);
                }
            }            if (salemanddl.SelectedValue != "")
            {
                list = list.Where(p => p.SaleMan == new Guid(salemanddl.SelectedValue));
            }            if (search != null)
                list = list.Where(p => p.UserName.Contains(search) || p.Email.Contains(search) || p.CorpName.Contains(search));
            return list.OrderByDescending(p => p.CreateDate);
           }
        }
    if (membertypeddl.SelectedValue == "免费会员")
                {
                    //获取所有收费会员的id
                    var chargelist = dc.aspnet_UsersInRoles.Where(p => (p.RoleId == businessId || p.RoleId == newsRoleId || p.RoleId == jobRoleId) && (p.Expire >= DateTime.Now)).Select(p => p.UserId);
                    list = list.Where(l => !chargelist.Contains(l.UserId));
                }
                else
                {
                    Guid searchRoleId = new Guid(membertypeddl.SelectedValue);
                    var chargelist = dc.aspnet_UsersInRoles.Where(p => (p.RoleId == searchRoleId) && (p.Expire >= DateTime.Now)).Select(p => p.UserId);
                    list = list.Where(l => chargelist.Contains(l.UserId));
                }
            }
//这段是出错的。。chargelist 里面有数据 list 有数据。但是
却出现 null 的异常。。请高人指点

解决方案 »

  1.   

    具体出错在哪一句?出错的时候能不能确定chargelist 不是Null?
      

  2.   

    不是null
    chargelist.count() = 2741
    list.count()=4565
    百分百肯定的。。
    之前是charglist.ToList()但由于数目>2100所以就出错。
    现在换成这样也照样出错。。
      

  3.   

      list = list.Where(l => chargelist.Contains(l.UserId));
    这句出错。。
      

  4.   

    没有调试不知道lz看看整个list当中,有没有那个元素的 UserId 字段是空或非法的?
    UserId应该是int吧?int应该不会出问题的啊。
      

  5.   

    你好。。userid 是主键,而且是uniquedentifier类型的。。
    是不是我的charlist数量太多导致出错啦?
      

  6.   

    不论你是否认为某些代码的值一定不可能是null,我告诉你一个编程诀窍,聪明人一定要狠狠地折磨电脑而让自己少浪费脑筋在低级的地方。因此,你至少可以更加谨慎地写出谨慎地探测是否是null的代码,千万不要舍不得浪费那一点毫不值钱的执行性能。
      

  7.   

    学习了
    不可能因为太多而导致这样的错误。我处理过更多的数据,也没有问题。
    写个简单的linq,
    var q = list.Where(l => l.UserId == null);
    看看q有没有结果就知道有没有null的UserId了。编程的时候要养成在任何可能出错的地方使用ASSERT的习惯。
      

  8.   


     if (membertypeddl.SelectedValue == "免费会员")
                    {
                        //获取所有收费会员的id
                        var chargelist = dc.aspnet_UsersInRoles.Where(p => (p.RoleId == businessId || p.RoleId == newsRoleId || p.RoleId == jobRoleId) && (p.Expire >= DateTime.Now)).Select(p => p.UserId);
                        if (chargelist.Count() > 0)
                        {
                            list = list.Where(l => !chargelist.Contains(l.UserId != null ? l.UserId : Guid.Empty));
                        }
                    }
                    else
                    {
                        Guid searchRoleId = new Guid(membertypeddl.SelectedValue);
                        var chargelist = dc.aspnet_UsersInRoles.Where(p => (p.RoleId == searchRoleId) && (p.Expire >= DateTime.Now)).Select(p => p.UserId).ToList();
                        if (chargelist.Count() > 0)
                        {
                            list = list.Where(l => chargelist.Contains(l.UserId != null ? l.UserId : Guid.Empty));
                        }
                    }换成这样啦,null 的就不要啦
    照样不行啊。。跪求大家。。应怎样处理
      

  9.   

     var chargelist = dc.aspnet_UsersInRoles.Where(p => (p.RoleId == searchRoleId) && (p.Expire >= DateTime.Now)).Select(p => p.UserId);
                        list = list.Where(l => chargelist.Contains(l.UserId))?null:"";
      

  10.   

    看来不是代码的错。当charlist数量达到 两千以上 的时候都会 有这个错误。。
    我原来用的好好的。只是一种权限会员人数太多的时候都有这个问题。。
    我想用一个外连接的办法来解决
      

  11.   

    那我用小数据量的时候就没问题后来改成这样。。用left join 啦public IQueryable SearchUser(DropDownList systemddl, DropDownList membertypeddl, DropDownList stateddl, DropDownList salemanddl, TextBox searchtxt)
            {
                var dc = DataContext;
                var search = searchtxt.Text.Trim();            var list = from m in dc.aspnet_Membership
                           where m.ApplicationId.ToString() != "7DA23851-4337-46B1-BC1D-940FDD05492A"
                           join ap in dc.aspnet_UsersInRoles on m.UserId equals ap.UserId into temp
                           from x in temp.DefaultIfEmpty()
                           select new { m, m.aspnet_Users, m.aspnet_Users.PublicInfo, x };
                //select new { m.aspnet_Applications.ApplicationName, m.UserId, m.aspnet_Users.UserName, m.CreateDate, m.Email, m.IsApproved, m.IsLockedOut, m.LastLoginDate, m.LastLockoutDate, m.aspnet_Users.PublicInfo.SaleMan, m.aspnet_Users.PublicInfo.CorpName,m.ApplicationId };            if (systemddl.SelectedValue != "") //按用户所属网站查找用户
                    list = list.Where(p => p.aspnet_Users.ApplicationId == new Guid(systemddl.SelectedValue));            if (membertypeddl.SelectedValue != "")//按用户所有权限查找用户
                {
                    Guid businessId = new Guid(System.Configuration.ConfigurationManager.AppSettings["businessRoleId"].ToString());
                    Guid newsRoleId = new Guid(System.Configuration.ConfigurationManager.AppSettings["newsRoleId"].ToString());
                    Guid jobRoleId = new Guid(System.Configuration.ConfigurationManager.AppSettings["hrRoleId"].ToString());                if (membertypeddl.SelectedValue == "免费会员")
                    {
                        //获取所有收费会员的id
                        list = list.Where(p => p.x.RoleId == null || (p.x.RoleId != null && p.x.Expire < DateTime.Now));
                    }
                    else
                    {
                        Guid searchRoleId = new Guid(membertypeddl.SelectedValue);
                        list = list.Where(p => p.x.RoleId == searchRoleId && p.x.Expire >= DateTime.Now);
                    }
                }            if (stateddl.SelectedValue != "")
                {
                    if (stateddl.SelectedValue == "1")
                    {
                        list = list.Where(u => u.m.IsApproved == true);
                    }
                    else if (stateddl.SelectedValue == "0")
                    {
                        list = list.Where(u => u.m.IsApproved == false);
                    }
                }            if (salemanddl.SelectedValue != "")
                {
                    list = list.Where(p => p.PublicInfo.SaleMan == new Guid(salemanddl.SelectedValue));
                }            if (search != null)
                    list = list.Where(p => p.aspnet_Users.UserName.Contains(search) || p.PublicInfo.Email.Contains(search) || p.PublicInfo.CorpName.Contains(search));            return list.OrderByDescending(m => m.m.CreateDate).Select(m => new { m.m.aspnet_Applications.ApplicationName, m.m.UserId, m.aspnet_Users.UserName, m.m.CreateDate, m.m.Email, m.m.IsApproved, m.m.IsLockedOut, m.m.LastLoginDate, m.m.LastLockoutDate, m.aspnet_Users.PublicInfo.SaleMan, m.aspnet_Users.PublicInfo.CorpName, m.m.ApplicationId });        }这样运行的好好的。。
    就是因为charlist里数目太多,导致生成不了查询语句。我是这样觉得的.
      

  12.   

    没问题的。。有数目。。我charlist.count()是大于0的