C# 无法为列表中的列表翻译来自的.NET Core 3.1 LINQ表达式
我有一个包含博客帖子ID的列表。该列表是通过一个单独的系统生成的,该系统允许用户从多个参数中筛选帖子。我已经测试过了,它是有效的。我的目标是获取这个列表并执行一个LINQ查询,该查询将获取发表帖子的用户,并根据发布者对帖子进行排序。查询如下:C# 无法为列表中的列表翻译来自的.NET Core 3.1 LINQ表达式,c#,linq,C#,Linq,我有一个包含博客帖子ID的列表。该列表是通过一个单独的系统生成的,该系统允许用户从多个参数中筛选帖子。我已经测试过了,它是有效的。我的目标是获取这个列表并执行一个LINQ查询,该查询将获取发表帖子的用户,并根据发布者对帖子进行排序。查询如下: List<UserPostDTO> UserPosts = await (from x in _context.UserPosting //UserPosting links User and Post tab
List<UserPostDTO> UserPosts =
await (from x in _context.UserPosting //UserPosting links User and Post tables in the db. It has both user id and post id
where PostedByList.Contains(x.Posting.PostingId) //PostedByList is a List<int>
&& x.Approved == "A" //only show posts that have been approved
&& x.User.Active == true //only show posts from active users
group x by new { x.User.FirstName, x.User.LastName, x.User.UserId } into xGroup
select new UserPostDTO //Object containing First/Last name, email, and List<PostPOCO>
{
FirstName = xGroup.Key.FirstName, //string
LastName = xGroup.Key.LastName, //string
UserEmail = xGroup.Key.UserId, //int
//PostsByUser = (from y in xGroup //List of PostPOCO objects
// select new PostPOCO
// {
// PostTitle = y.Posting.Title, //string
// PostId = y.Posting.PostingId //int
// }).ToList()
}).ToListAsync(); //I have read this should solve the issue. It does not.
列出用户帖子=
wait(从_context.UserPosting//UserPosting中的x)链接数据库中的用户和Post表。它同时具有用户id和Post id
其中PostedByList.Contains(x.Posting.PostingId)//PostedByList是一个列表
&&x.已批准==“A”//仅显示已批准的帖子
&&x.User.Active==true//仅显示来自活动用户的帖子
按新的{x.User.FirstName,x.User.LastName,x.User.UserId}将x分组到xGroup中
选择newuserpostdto//Object,其中包含名字/姓氏、电子邮件和列表
{
FirstName=xGroup.Key.FirstName,//字符串
LastName=xGroup.Key.LastName,//字符串
UserEmail=xGroup.Key.UserId,//int
//PostsByUser=(来自xGroup//PostPOCO对象列表中的y)
//选择新的Postoco
// {
//PostTitle=y.Posting.Title,//字符串
//PostId=y.Posting.PostingId//int
//}).ToList()
}).ToListAsync()//我读过这篇文章,应该可以解决这个问题。事实并非如此。
当我取消对PostsByUser查询部分的注释时,在点击查询时会出现以下错误:
无法翻译LINQ表达式[…]。以可以翻译的形式重写查询,或者通过插入对AsEnumerable()、AsAsAsAsyncEnumerable()、ToList()或ToListSync()的调用显式切换到客户端计算。有关更多信息,请参阅
如果对代码的这一部分进行了注释,则运行时不会出现任何错误
我想不出办法来解决这个问题。我已尝试用\u context.UserPosting.AsEnumerable()
替换第二行,但这与.ToListAsync()冲突,后者本应是客户机/服务器评估解决方案的一部分。所以那里没有运气
这有点问题,因为子列表依赖于主查询
有没有办法解决这个问题?我在LinqPad试用过,效果不错。它在VisualStudio中编译,没有错误。它只是在实际尝试运行时崩溃了。我发现了。事实证明,微软对EF Core的新修改所施加的限制改变了Group条款中的工作原理: 要使其工作,需要对数据库进行新的查询。可能不太理想,但事实是:
List<UserPostDTO> UserPosts =
await (from x in _context.UserPosting
where PostedByList.Contains(x.Posting.PostingId)
&& x.Approved == "A"
&& x.User.Active == true
group x by new { x.User.FirstName, x.User.LastName, x.User.UserId } into xGroup
select new UserPostDTO
{
FirstName = xGroup.Key.FirstName,
LastName = xGroup.Key.LastName,
UserEmail = xGroup.Key.UserId,
PostsByUser = (from y in _context.UserPosting
where xGroup.Key.UserId == y.UserId
select new PostPOCO
{
PostTitle = y.Posting.Title,
PostId = y.Posting.PostingId
}).ToList()
}).ToListAsync();
列出用户帖子=
等待(从x in_context.UserPosting
其中PostedByList.Contains(x.Posting.PostingId)
&&x.批准==“A”
&&x.User.Active==true
按新的{x.User.FirstName,x.User.LastName,x.User.UserId}将x分组到xGroup中
选择newuserpostdto
{
FirstName=xGroup.Key.FirstName,
LastName=xGroup.Key.LastName,
UserEmail=xGroup.Key.UserId,
PostsByUser=(来自_context.UserPosting中的y)
其中xGroup.Key.UserId==y.UserId
选择新的Postoco
{
PostTitle=y.Posting.Title,
PostId=y.Posting.PostingId
})托利斯先生()
}).ToListAsync();