C# 如何将具有多个联接的Linq表达式转换为方法语法或检索选择索引?

C# 如何将具有多个联接的Linq表达式转换为方法语法或检索选择索引?,c#,linq,lambda,C#,Linq,Lambda,我有一个现有的工作!linq表达式: from ca in db.CustomAnswer join ss in db.SurveySubmission on ca.SubmissionId equals ss.Id join cq in db.CustomQuestion on ca.QuestionId equals cq.Id where (ss.SurveyId == request.SurveyId) orderby ss.Submitted, cq.SortOrder select

我有一个现有的工作!linq表达式:

from ca in db.CustomAnswer
join ss in db.SurveySubmission on ca.SubmissionId equals ss.Id
join cq in db.CustomQuestion on ca.QuestionId equals cq.Id
where (ss.SurveyId == request.SurveyId)
orderby ss.Submitted, cq.SortOrder
select new
{
    SubmissionId = ss.Id,
    Answer = ca.Answer
}
我想将select的索引添加到新对象中,例如

from ca in db.CustomAnswer
join ss in db.SurveySubmission on ca.SubmissionId equals ss.Id
join cq in db.CustomQuestion on ca.QuestionId equals cq.Id
where (ss.SurveyId == request.SurveyId)
orderby ss.Submitted, cq.SortOrder
select new
{
    SubmissionId = ss.Id,
    **Code = selectIndex,**
    Answer = ca.Answer
}
为此,我认为首先需要将查询转换为方法语法,以便使用Selectq,index=>。。。类型在我看来,我认为应该是:

  db.SurveySubmission
    .Where(ss => ss.SurveyId == request.SurveyId)
    .OrderBy(ss => ss.Submitted)
    .Join(db.CustomAnswer, ss => ss.Id, ca => ca.SubmissionId, (ss, ca) => new { ss, ca })
    .Join(db.CustomQuestion, o => o.ca.QuestionId, cq => cq.Id, (o, cq) => new { o.ss, o.ca, cq })
    .OrderBy(q => q.cq.SortOrder)
    .Select((q, idx) => new {
                                SubmissionId = q.ss.Id,
                                Answer = q.ca.Answer,
                                Code = idx
                            });
但是,当计算表达式时,我得到一个错误:

LINQ to实体无法识别该方法 'System.Linq.IQueryable1[f__AnonymousTypef3[System.Guid,System.String,System.Int32]] 选择[f_匿名类型E3,f_匿名类型F3] System.Linq.IQueryable1[f_u匿名类型3[My.Data.Namespace.SurveySubmission, My.Data.Namespace.CustomAnswer,My.Data.Namespace.CustomQuestion]], System.Linq.Expressions.Expression1[System.Func3[f_AnonymousType3[My.Data.Namespace.SurveySubmission, My.Data.Namespace.CustomAnswer,My.Data.Namespace.CustomQuestion],System.Int32,f__AnonymousTypef3[System.Guid, System.String,System.Int32]]' 方法,而此方法无法转换为存储表达式


我希望这对某人来说是显而易见的?我已经盯着它看了几个小时,我唯一能得出的结论是我不够聪明。。。有人能帮忙吗???

EF无法将其转换为SQL,因为在SQL集合中是无序的;索引的想法对它来说毫无意义

而是使用EF查询获取索引,然后在linq to objects查询中附加索引:

var query = //your original query goes here

var finalQuery = query.AsEnumerable()
    .Select((answer, index) => new
        {
            answer.SubmissionId,
            answer.Answer,
            Code = index,
        });

EF无法将其转换为SQL,因为SQL中的集合是无序的;索引的想法对它来说毫无意义

而是使用EF查询获取索引,然后在linq to objects查询中附加索引:

var query = //your original query goes here

var finalQuery = query.AsEnumerable()
    .Select((answer, index) => new
        {
            answer.SubmissionId,
            answer.Answer,
            Code = index,
        });

啊哈,谢谢你,这比错误更有意义!!AsEnumerable在这里很关键——没有它,我会得到同样的错误。这是因为调用AsEnumerable会计算表达式而延迟执行吗?为什么@AndyC AsEnumerable确保变量的类型是IEnumerable,而不是IQueryable,因此调用的方法是IEnumerable重载,虽然它们看起来相同,但做的事情却完全不同。谢谢@Servy的帮助。啊哈,谢谢你这么说-这比错误更有意义!!AsEnumerable在这里很关键——没有它,我会得到同样的错误。这是因为调用AsEnumerable会计算表达式而延迟执行吗?为什么@AndyC AsEnumerable确保变量的类型是IEnumerable,而不是IQueryable,因此调用的方法是IEnumerable重载,虽然它们看起来相同,但做的事情却完全不同。谢谢@Servy的帮助。