序列没有匹配元素(LET CLAUSE)

时间:2013-11-06 14:23:34

标签: c# linq

我不是linq鲨鱼,但我有一个问题似乎无法解决。这是我的代码:

        using (var dwCtx = new NordicDWEntities())
        using (var ctx = new NordicDSA())
        {
            var rawClusters = ctx.SurveyClusters.Include(x => x.SurveyClusterVariables).Where(x => x.SurveyId == request.ProjectId && x.SurveyCode == request.SurveyCode).ToArray();
            var masterIds = rawClusters.SelectMany(x => x.SurveyClusterVariables.Select(y => y.MasterVariableID)).Distinct().ToArray();
            var masterVariables = dwCtx.SurveyMasterVariables.Where(x => masterIds.Contains(x.MasterVariableID)).ToArray();

            var values =
                (from r in ctx.STAGE_ResponseOption
                 join m in ctx.SurveyVariableMaps on r.VariableCode equals m.VariableCode
                 where
                     m.SurveyId == request.ProjectId
                     && m.SurveyCode == request.SurveyCode
                     && (m.IgnoreVariable.HasValue && m.IgnoreVariable < 1)
                     && masterIds.Contains(m.MasterVariableID.Value)
                     && r.SurveyCode == request.SurveyCode
                 select new { Value = r, Map = m }).ToArray();

            var clusters =
                (from c in rawClusters
                 where c.SurveyId == request.ProjectId && c.SurveyCode == request.SurveyCode
                 select new ClusterResponseElement
                 {
                     ClusterId = c.SurveyClusterID,
                     ClusterCode = c.SurveyClusterCode,
                     ClusterName = c.SurveyClusterName,
                     Target = c.Targetweight.Value,
                     Variables =
                     (from v in c.SurveyClusterVariables
                      group v by v.MasterVariableID into g
                      let m = masterVariables.FirstOrDefault(x => x.MasterVariableID == g.Key)
                      select new ClusterVariableResponseElement
                      {
                          MasterVariableId = m.MasterVariableID,
                          MasterVariableCode = m.MasterVariableCode,
                          MasterVariableName = m.MasterVariableName,
                          Values = (
                            from vv in g
                            let vm = values.First(x => x.Map.MasterVariableID == vv.MasterVariableID && x.Value.ResponseOptionCode == vv.DistinctValue)
                            select new ClusterVariableValue {
                                Id = vv.SurveyClusterVariableID,
                                DistinctDisplay = vm.Value.ResponseOptionText,
                                Distinct = vm.Value.ResponseOptionCode,
                                From = vv.FromValue,
                                To = vv.ToValue
                            })
                      })


                 }).ToArray();

            return clusters;

我在LET子句

上得到“序列没有匹配元素错误”
let vm = values.First(x => x.Map.MasterVariableID == vv.MasterVariableID && 
                           x.Value.ResponseOptionCode == vv.DistinctValue)

任何帮助表示赞赏!我对LINQ不太熟悉

2 个答案:

答案 0 :(得分:1)

这意味着 - 您要求LINQ为您提供序列的第一个元素,但没有。

在您的查询中,您正在使用FirstOrDefault。如果它适合您的用例,您可以考虑使用它:

let vm = values.FirstOrDefault(x =>
    x.Map.MasterVariableID == vv.MasterVariableID
    && x.Value.ResponseOptionCode == vv.DistinctValue
)

否则,您必须重新查询您的查询,以确保始终获得单个元素。

答案 1 :(得分:0)

只有在您确定序列包含元素时才能使用First,否则您将获得此异常。我假设您已经知道,因为您还使用了FirstOrDefault。所以问题是如何在查询为空时获取ClusterVariableValue,可能是FirstOrDefault和这个条件运算符:

...
let vm = values.FirstOrDefault(x => x.Map.MasterVariableID == vv.MasterVariableID && x.Value.ResponseOptionCode == vv.DistinctValue)
let cv = vm == null ? null : 
    new ClusterVariableValue {
        Id = vv.SurveyClusterVariableID,
        DistinctDisplay = vm.Value.ResponseOptionText,
        Distinct = vm.Value.ResponseOptionCode,
        From = vv.FromValue,
        To = vv.ToValue
    }
select cv   
....

如果序列中没有匹配的元素,则ClusterVariableValue为空。