值不能为null,参数名称:source

时间:2012-08-22 20:40:16

标签: c# asp.net-mvc-3

我正在向我的viewmodel发送对象集合,如下所示

控制器

SoundsViewModel model = new SoundsViewModel(sound, AllGroups());

视图模型

public SoundsViewModel(sound, List<LocationGroup> allGroups)
        {
            ....

            Groups = new List<SoundLocationGroupViewModel>();
            if (allGroups !=null)
            {
                foreach (var item in allGroups)
                {
                    var i = (from r in sound.LocationGroups where r.Id == item.Id select r).FirstOrDefault();
                    Groups.Add(new SoundLocationGroupViewModel() { LocationGroupId = item.Id, LocationGroupName = item.Name, IsInLocationGroup = (i != null) });
                } 
            }
        }

错误消息

Value cannot be null.
Parameter name: source

 var i = (from r in sound.LocationGroups where r.Id == item.Id select r).FirstOrDefault();

显然,这个消息在描述情况下似乎是完美和清晰的,但在重新布局时,我正在使用viewmodel填充并正确接收allGroups集合。

任何想法,已经很晚了,如果有人建议我如何在tommorow早晨咖啡中解决这个问题,我会非常感激。

由于

更新: 现在它已经过去了。

foreach (var item in allGroups)
 {
    if(sound.LocationGroups !=null)
    {
     var i = (from r in sound.LocationGroups where r.Id == item.Id select r).FirstOrDefault();
     Groups.Add(new SoundLocationGroupViewModel() { LocationGroupId = item.Id, LocationGroupName = item.Name, IsInLocationGroup = (i != null) });
    }

}

1 个答案:

答案 0 :(得分:1)

source可能来自FirstOrDefault()扩展方法:

public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source) 

由于某种原因,您的Linq查询返回null。分两步尝试(并使用Any代替FirstOrDefault,因为您只是检查非空结果):

bool isInGroup;
var q = (from r in sound.LocationGroups where r.Id == item.Id select r);
isInGroup = (q != null && q.Any());

Groups.Add(new SoundLocationGroupViewModel() 
    {
         LocationGroupId = item.Id, 
         LocationGroupName = item.Name, 
         IsInLocationGroup = isInGroup 
    });

<击>

它的价值source仍然来自Linq扩展方法,而不是我想到的那个。由于sound.LocationGroupsnull,因此扩展方法(我猜Where)会将linq语句编译为。