C# SQL优化以获得每个用户的积分

C# SQL优化以获得每个用户的积分,c#,sql,C#,Sql,我有一个代码,我真的需要一些关于如何优化的建议 我在系统中有超过10000个用户和1000000个代码,所以这需要花费很长时间 感谢您的帮助: List<User> userResults = (from u in myDB.Users select new { User = u, Sum = (from tc in

我有一个代码,我真的需要一些关于如何优化的建议

我在系统中有超过10000个用户和1000000个代码,所以这需要花费很长时间

感谢您的帮助:

 List<User> userResults = (from u in myDB.Users
                   select new
                   {
                       User = u,
                       Sum = (from tc in myDB.TriviaCodes
                              where tc.userID == u.userID &&
                              (tc.dateRedeemed.Value.Hour < 20 ? tc.dateRedeemed.Value.Date == date.Date : tc.dateRedeemed.Value.Date == yesterday.Date)
                              select tc).Sum(p => p == null ? 0 : p.pointsGained)
                   })
           .OrderByDescending(g => g.Sum)
           .Where(g => g.Sum != 0)
           .Select(g => g.User)
           .Take(100)
           .ToList();


首先,您应该将foregin键添加到表TriviaCodes的userID字段中。 然后试试这样的事情:

        var userResults =
            (
                from u in myDB.Users
                join tc in myDB.TriviaCodes on u.userID equals tc.userID

                where
                    (tc.dateRedeemed.Value.Hour < 20
                        ? tc.dateRedeemed.Value.Date == date.Date
                        : tc.dateRedeemed.Value.Date == yesterday.Date)
                select new
                {
                    u,
                    tc
                }
            )


       .GroupBy(k => k.u.userID)
                .Select(group => new
                {
                    user = group.First().u,
                    points = group.Sum(p => p.tc.pointsGained)
                })
       .OrderByDescending(u => u.points)
       .Where(u => u.points > 0)
       .Select(u => u)
       .Take(100)
       .ToList();
var用户结果=
(
来自myDB.Users中的u
在myDB.TriviaCodes中加入tc,u.userID等于tc.userID
哪里
(tc.Date.Value.Hour<20
?tc.DateReceived.Value.Date==日期.Date
:tc.datereceived.Value.Date==昨天.Date)
选择新的
{
U
tc
}
)
.GroupBy(k=>k.u.userID)
.选择(组=>新建
{
user=group.First().u,
点=组和(p=>p.tc.pointsGained)
})
.OrderByDescending(u=>u.points)
.其中(u=>u.points>0)
.选择(u=>u)
.拿(100)
.ToList();

这真的没有多大帮助。我们需要看到正在生成的实际T-SQL,最好是正在生成的查询计划。我不理解您所说的任何内容。如果没有Randy建议的额外细节,我们没有什么可以帮助的,除了可能建议将用户的总分汇总在数据库中,而不是每次汇总。您需要什么额外的详细信息?我如何找到它?我在VisualStudio工作。表后面的所有数据都是使用.dbml文件自动创建的。您使用的是EntityFramework吗?如果是这样,请将
.ToList()
替换为
.ToString()
,然后将生成的字符串复制并粘贴到此问题中。
CREATE TABLE [dbo].[Users] (
    [userID]       INT            NOT NULL,
    [UDID]         NVARCHAR (MAX) NULL,
    [firstName]    NVARCHAR (MAX) NULL,
    [lastName]     NVARCHAR (MAX) NULL,
    [cellNo]       NVARCHAR (MAX) NULL,
    [address]      NVARCHAR (MAX) NULL,
    [city]         NVARCHAR (MAX) NULL,
    [zip]          NVARCHAR (MAX) NULL,
    [creditCode]   NVARCHAR (MAX) NULL,
    [GameThriveID] NVARCHAR (MAX) NULL,
    [homeNumber]   NVARCHAR (MAX) NULL,
    PRIMARY KEY CLUSTERED ([userID] ASC)
        var userResults =
            (
                from u in myDB.Users
                join tc in myDB.TriviaCodes on u.userID equals tc.userID

                where
                    (tc.dateRedeemed.Value.Hour < 20
                        ? tc.dateRedeemed.Value.Date == date.Date
                        : tc.dateRedeemed.Value.Date == yesterday.Date)
                select new
                {
                    u,
                    tc
                }
            )


       .GroupBy(k => k.u.userID)
                .Select(group => new
                {
                    user = group.First().u,
                    points = group.Sum(p => p.tc.pointsGained)
                })
       .OrderByDescending(u => u.points)
       .Where(u => u.points > 0)
       .Select(u => u)
       .Take(100)
       .ToList();