C# 如何将具有多个联接的Linq表达式转换为方法语法或检索选择索引?
我有一个现有的工作!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
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的帮助。