【问题标题】:LINQ and SQL performance issue when working with Membership使用 Membership 时的 LINQ 和 SQL 性能问题
【发布时间】:2010-04-14 14:58:34
【问题描述】:

我正在使用具有 50000 条记录的 ASPNET 成员资格,并且我们有另一个名为“scm_Users”的表,其中包含确切数量的记录,它们没有通过任何键链接。我有一个简单的 SQL:

select * from dbo.aspnet_Users a, dbo.scm_Users b
where a.UserName = b.UserName

我可以在不到 1 秒的时间内获得 50000 条记录。

在 LINQ 中,(使用实体框架)当我尝试做同样的事情时:

IEnumerable<MembershipUser> allMembershipUsers = Membership.GetAllUsers().Cast<MembershipUser>();
ObjectQuery<User> users = this.DataContext.UserSet;

var    result = (from a in allMembershipUsers
                      from b in users
                      where a.UserName == b.UserName
                 select new 
                 {
                   ..... 
                 }).AsEnumerable();

当我将结果绑定到 Grid 时,50000 条记录超时。当我调试它并将鼠标悬停在“结果视图”上时,它也超时了。当然,如果我使用 Membership.FindUsersByName() 并限制记录的数量,它将返回结果。

而且,如果我将 50000 条记录直接绑定到 Grid 而不查询 Membership,Grid 也可以工作。

 var    result = (from b in users
                  select b).AsEnumerable();

我做错了什么?

注意

【问题讨论】:

  • 您不需要 .AsEnumerable() 或 cast 调用。

标签: sql linq entity-framework asp.net-membership linq-to-entities


【解决方案1】:

Membership 是什么?在我看来,您从 2 个不同的数据源中提取数据,这会将它们都加载到内存中并在内存中的集合上执行工作。您还在看起来相当大的数据集上使用了很多类型转换。

试试这样的:

var result = from a in DataContext.MembershipUsers
             join b in DataContext.UsersSet on a.UserName equals b.UserName
             select new { ... };

【讨论】:

【解决方案2】:

一个显着的区别是您正在流式传输 10 万条记录而不是 5 万条记录。 SQL 查询将结合服务器上的两个结果,并返回两个表之间连接的 50K 行数据。在您的示例中,您通过 GetAllUsers 拉下 50K,通过 UserSet 拉下另外 50K。问题是,除非您直接通过 DataContext 查询 aspnet Membership 表,否则您将无法避免这种情况。

【讨论】:

  • 你是对的,在处理这种大小的数据时,可能不容易避免。另一方面,我试图在 DataContext 中没有 aspnet_Membership 和 aspnet_Users,我觉得如果我需要切换 Active Directory 等 Membership Provider 是不好的做法,那么我不必重写任何代码。跨度>
【解决方案3】:

我会说导致速度变慢的是演员,而不是查询。在没有演员表的情况下尝试一下,然后让原始实体返回,看看这是否会加快速度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2010-12-17
    • 1970-01-01
    • 2022-06-15
    • 2011-03-10
    • 1970-01-01
    相关资源
    最近更新 更多