1

我不是 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不太熟悉

4

2 回答 2

1

这意味着——你要求 LINQ 给你一个序列的第一个元素,但没有。

在您使用的查询的前面FirstOrDefault。如果它适合您的用例,您也可以考虑在此处使用它:

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

否则,您将不得不重新处理您的查询,以确保您始终获得单个元素。

于 2013-11-06T14:26:31.740 回答
0

First只有在确定序列包含元素时才能使用,否则会出现此异常。我假设您已经知道,因为您也使用过FirstOrDefault. 所以问题是当查询为空时如何获取ClusterVariableValue查询中的 s,也许使用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 如果序列中没有匹配的元素,则now为 null。

于 2013-11-06T14:29:36.213 回答