C#EntityFramework获取数据的有效方法(OrderBy + Distinct)

时间:2018-05-01 13:14:39

标签: c# entity-framework

我希望使用最新的登录时间从数据库中获取不同的用户。我的代码有效但芬兰需要20多秒。我可以优化我的代码吗?

var usersFromDb = _Context.Users
    .OrderByDescending(u => u.Time)
    .DistinctBy(u => u.ID).ToList();

型号:

public class User
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public int Client { get; set; }
        public DateTime Time { get; set; }

    }

此表有100k记录

2 个答案:

答案 0 :(得分:1)

除非我遗漏了某些内容,否则用户应该已经拥有唯一的ID,因此不同的内容是多余的。

我希望SQL优化器知道如果它是Clustered Index,但你可以尝试删除它。

您需要退回所有用户吗?你在使用延迟加载吗?您可能也在撤回客户端数据,因此可能需要检查SQL Server分析器以查看发生的情况。

您也可以返回所需的字段:

var usersFromDb = _Context.Users
    .Select(u => new MyUser
        {
            Id = u.ID,
            Name = u.Name,
            Time = u.Time
        }).
    .OrderByDescending(u => u.Time)
    .ToList();

答案 1 :(得分:0)

您应该为Time字段添加非聚集索引以优化OrderBy操作。例如,您可以像这样更改模型

public class User
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int Client { get; set; }
    [Index]
    public DateTime Time { get; set; }

}

然后将迁移应用到DB。另外,您可以在不更改EF模型的情况下在数据库中创建索引,只需执行下一个sql查询

CREATE INDEX IDX_Time ON Users (Time); 

在排序列上定义索引可以改善性能结果。

由于ID不是主键,您应该从两列创建覆盖索引以最大化性能查询

CREATE INDEX IDX_Time ON Users (Time, ID);