我不是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不太熟悉
答案 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
为空。