我想在有序列表中选择用户的位置。
我只能通过将所有项目加载到内存中然后使用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', …