实体框架选择项目在有序列表中的位置 - c#

我想在有序列表中选择用户的位置。

我只能通过将所有项目加载到内存中然后使用IndexAt()方法查找位置来使其工作。但是,当数据库中有很多行时,这并不是很好。

        public static async Task<int> GetUsersRank(DbEntities db, string userId)
    {           
      var items = await db.UserIqAnswers.Where(x => x.IqQuestion.CorrectAnswer == x.Answer).GroupBy(x => x.UserId).Select(x => new { userId = x.Key, points = x.Sum(y => y.IqQuestion.Points) })
         .OrderBy(x => x.points)
         .ToListAsync();
      return items.FindIndex(x => x.userId == userId) + 1;         
    }

我怎样才能更有效地做到这一点?

参考方案

像这样吗
这将运行两个查询。一个加载当前用户的信息,另一个加载列表中的位置。
但是,查询应该相当有效。第二个应在SQL服务器端作为COUNT()完成。

var sumByUser = db.UserIqAnswers.Where(x => x.IqQuestion.CorrectAnswer == x.Answer)
    .GroupBy(x => x.UserId)
    .Select(x => new { userId = x.Key, points = x.Sum(y => y.IqQuestion.Points) });
var currentUser = sumByUser.Where(x => x.userId == userId).Single();
var rank = sumByUser.Where(x => x.points > currentUser.points).Count();

请注意,'sumByUser'查询永远不会执行,它仅用作接下来两个查询的基础。

您可以使用LINQ语法将其重写为一个查询运行:

(from currentUser in sumByUser.Where(x => x.userId == userId)
 from rank in sumByUser.Where(x => x.points > currentUser.points
 select new { currentUser, rank = rank.Count()}).Single()

但是我可以检查一下生成的SQL来确定。

与哪些运算符>>兼容 - java

我这里没有什么代码int b=3; b=b >> 1; System.out.println(b); 它可以完美工作,但是当我将变量b更改为byte,short,float,double时,它包含错误,但是对于变量int和long来说,它可以完美工作,为什么它不能与其他变量一起工作? 参考方案 位移位运算符(例如>>)与任何整数类型兼…

Entity Framework DbEntityEntry>'不包含Where的定义 - c#

此代码狙击手来自Adding CreatedDate to an entity using Entity Framework 5 Code First public override int SaveChanges() { DateTime saveTime = DateTime.Now; foreach (var entry in this.ChangeT…

剃刀付款集成->如何通过关闭按钮X检测剃刀付款模型是否关闭 - javascript

当用户关闭而无需付款时,我在CI框架中使用Razorpay,请创建razor支付模型,然后取消订单,我希望按状态更改为已取消的状态触发查询。所以我怎么能检测到这一点。我已经通过单击jQuery单击关闭功能但无法使用... javascript大神给出的解决方案 Razorpay提供了JS方法来检测模式关闭。您编写的任何JS代码都不会在结帐页面上运行,因为它是…

如何使用箭头符号(->)创建受保护的方法? - java

当我们编写以下代码时Stream.of(1,2,3,4,5).filter(i -> (i%2 == 0)).map( i -> i*i ); 表达式i -> (i%2 == 0)或i -> i*i将变为私有方法。在我的用例中,编写了一个junit测试,以确保没有方法是私有的(是的,这是强制性的),并且对于这些lambda表达式而言,…

粗糙的Unicode->没有CLDR的语言代码? - javascript

我在写字典应用。如果用户键入Unicode字符,我想检查该字符是哪种语言。例如字 - returns ['zh', 'ja', 'ko'] العربية - returns ['ar'] a - returns ['en', 'fr', …