gpt4 book ai didi

c# - LINQ to Entities 无法识别该方法

转载 作者:太空宇宙 更新时间:2023-11-03 12:52:19 24 4
gpt4 key购买 nike

我写的这个查询失败了,我不确定为什么。

我正在做的是获取用户域对象列表,将它们投影到 View 模型,同时计算它们的排名,因为数据将显示在排行榜上。这就是我想做查询的方式。

 var users = Context.Users.Select(user => new
{
Points = user.UserPoints.Sum(p => p.Point.Value),
User = user
})
.Where(user => user.Points != 0 || user.User.UserId == userId)
.OrderByDescending(user => user.Points)
.Select((model, rank) => new UserScoreModel
{
Points = model.Points,
Country = model.User.Country,
FacebookId = model.User.FacebookUserId,
Name = model.User.FirstName + " " + model.User.LastName,
Position = rank + 1,
UserId = model.User.UserId,
});

return await users.FirstOrDefaultAsync(u => u.UserId == userId);

异常信息

System.NotSupportedException: LINQ to Entities does not recognize the method 'System.Linq.IQueryable`1[WakeSocial.BusinessProcess.Core.Domain.UserScoreModel] Select[<>f__AnonymousType0`2,UserScoreModel](System.Linq.IQueryable`1[<>f__AnonymousType0`2[System.Int32,WakeSocial.BusinessProcess.Core.Domain.User]], System.Linq.Expressions.Expression`1[System.Func`3[<>f__AnonymousType0`2[System.Int32,WakeSocial.BusinessProcess.Core.Domain.User],System.Int32,WakeSocial.BusinessProcess.Core.Domain.UserScoreModel]])' method, and this method cannot be translated into a store expression.

最佳答案

不幸的是,EF 不知道如何翻译 Select 的版本,它采用带有两个参数(值和等级)的 lambda。

对于您的查询,两个可能的选项是:

  1. 如果行集很小,可以跳过查询中指定Position,将所有UserScoreModels读入内存(使用ToListAsync),在内存中计算Position的值

  2. 如果行集很大,你可以这样做:

        var userPoints = Context.Users.Select(user => new
    {
    Points = user.UserPoints.Sum(p => p.Point.Value),
    User = user
    })
    .Where(user => user.Points != 0 || user.User.UserId == userId);

    var users = userPoints.OrderByDescending(user => user.Points)
    .Select(model => new UserScoreModel
    {
    Points = model.Points,
    Country = model.User.Country,
    FacebookId = model.User.FacebookUserId,
    Name = model.User.FirstName + " " + model.User.LastName,
    Position = 1 + userPoints.Count(up => up.Points < model.Points),
    UserId = model.User.UserId,
    });

请注意,这与我写的并不完全相同,因为两个总分持平的用户不会被任意分配到不同的排名。如果需要,您可以重写逻辑以打破 userId 或其他一些措施的联系。此查询可能不像您希望的那样干净整洁,但由于您最终只通过 userId 选择一行,因此希望不会太糟糕。您还可以将基本信息的排名查找和选择拆分为两个单独的查询,这可能会加快速度,因为每个查询都会更简单。

关于c# - LINQ to Entities 无法识别该方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35107552/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com