C# 不支持使用let关键字的实体框架核心5?
我正在尝试将我们的代码从EF6迁移到EF Core 5,但遇到了一些错误。 我正在使用的代码(部分代码)是: 这会产生如下错误: 该查询包含一个投影'h\uu TransparentIdentifier2=> h_u透明标识符2.h_u透明标识符1.OldStyles .Union(h__透明认证机构2.新闻风格研究) .OrderByDescending(x=>x.Date)类型为“IOrderedQueryable”。 最终投影中的集合必须是“IEnumerable”类型 例如“列表”。考虑使用“托利斯特”或其他机制 将“IQueryable”或“IOrderedEnumerable”转换为 “IEnumerable”C# 不支持使用let关键字的实体框架核心5?,c#,asp.net-core,entity-framework-core,C#,Asp.net Core,Entity Framework Core,我正在尝试将我们的代码从EF6迁移到EF Core 5,但遇到了一些错误。 我正在使用的代码(部分代码)是: 这会产生如下错误: 该查询包含一个投影'h\uu TransparentIdentifier2=> h_u透明标识符2.h_u透明标识符1.OldStyles .Union(h__透明认证机构2.新闻风格研究) .OrderByDescending(x=>x.Date)类型为“IOrderedQueryable”。 最终投影中的集合必须是“IEnumerable”类型 例如“列表”。考虑
我认为在我们的情况下,EF core不喜欢使用let关键字,我们有很多类似上面的代码,我们在EF6中使用let,这对“当前”查询中语句的可重用性和可读性非常好。EF core是否完全不支持这种模式,或者我缺少了什么?看起来他们不喜欢
IQueryable
投影(Select
-这是让隐藏的东西)。我不知道它们为什么引用最终投影,这些变量(选择)没有在最终投影中使用,这是new GetMailChimpUserDatabaseResult{…}
,对我来说听起来像EFC bug。我还尝试添加ToList(),这是一个错误(对我来说没有意义)。在OldStyleResearch、NewStyleResearch和Theer union之后添加了此项,但这只会导致另一个错误,即:无法翻译。以可以翻译的形式重写查询,或者通过插入对“AsEnumerable”、“asAsAsAsyncEnumerable”、“ToList”或“ToListSync”的调用显式切换到客户端计算。有关更多信息,请参阅。最好询问他们的GitHub回购协议-您是否提出了解决方案?
var usersQuery = (
from u in RepositoryContext.Users//.AsExpandable()
from n in RepositoryContext.NewsLetters.Where(x => x.IsSubscriber && u.Email.ToLower() == x.EmailAddress.ToLower())
let oldStyleResearches = (from ac in RepositoryContext.AssessmentCodes
join a in RepositoryContext.Assessments on ac.AssessmentKey equals a.AssessmentKey
join r in RepositoryContext.Research on a.AssessmentKey equals r.AssessmentKey
where ac.UserID == u.Id && a.CompletedDate != null
orderby a.CompletedDate descending
select new
{
Date = a.CompletedDate.Value,
Gender = r.Gender,
})
let newStyleResearches = (from ac in RepositoryContext.AssessmentCodes
join a in RepositoryContext.Assessments on ac.AssessmentKey equals a.AssessmentKey
join rr in RepositoryContext.ResearchResponses on a.AssessmentKey equals rr.AssessmentKey
where ac.UserID == u.Id && a.CompletedDate != null
orderby rr.CreatedOn descending
select new
{
Date = rr.CreatedOn,
//I had to do some mappings like that as questions do not have common type shared between surveys...
Gender = rr.SurveyId == 1 ? RepositoryContext.ResearchAnswers.FirstOrDefault(x => x.ResponseId == rr.ID && x.QuestionId == 3).Value :
rr.SurveyId == 2 ? RepositoryContext.ResearchAnswers.FirstOrDefault(x => x.ResponseId == rr.ID && x.QuestionId == 17).Value : string.Empty,
})
let researches = oldStyleResearches.Union(newStyleResearches).OrderByDescending(x => x.Date)
let firstNonNullWithGender = researches.FirstOrDefault(x => !string.IsNullOrEmpty(x.Gender))
select new GetMailChimpUserDatabaseResult
{
Id = null,
FirstName = string.Empty,
LastName = string.Empty,
Email = n.EmailAddress,
Gender = firstNonNullWithGender != null ? firstNonNullWithGender.Gender : string.Empty,
});
var result = usersQuery.ToList();