Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 遍历datacontext-最有效的方法?_C#_Performance_Linq_Entity Framework - Fatal编程技术网

C# 遍历datacontext-最有效的方法?

C# 遍历datacontext-最有效的方法?,c#,performance,linq,entity-framework,C#,Performance,Linq,Entity Framework,我已经开始在visual studio 2012中使用性能向导,因为有一个缓慢的方法,基本上用于从datacontext获取所有用户。我解决了最初的问题,但我现在很好奇是否能让它更快 目前我正在这样做: public void GetUsers(UserManagerDashboard UserManagerDashboard) { try { using (GenesisOnlineEnties = new GenesisOnlineEntities())

我已经开始在visual studio 2012中使用性能向导,因为有一个缓慢的方法,基本上用于从datacontext获取所有用户。我解决了最初的问题,但我现在很好奇是否能让它更快

目前我正在这样做:

public void GetUsers(UserManagerDashboard UserManagerDashboard)
{
    try
    {
        using (GenesisOnlineEnties = new GenesisOnlineEntities())
        {
            var q = from u in GenesisOnlineEnties.vw_UserManager_Users
                    select u;

            foreach (var user in q)
            {
                User u = new User();
                u.UserID = user.UserId;
                u.ApplicationID = user.ApplicationId;
                u.UserName = user.UserName;
                u.Salutation = user.Salutation;
                u.EmailAddress = user.Email;
                u.Password = user.Password;
                u.FirstName = user.FirstName;
                u.Surname = user.LastName;
                u.CompanyID = user.CompanyId;
                u.CompanyName = user.CompanyName;
                u.GroupID = user.GroupId;
                u.GroupName = user.GroupName;
                u.IsActive = user.IsActive;
                u.RowType = user.UserType;
                u.MaximumConcurrentUsers = user.MaxConcurrentUsers;
                u.ModuleID = user.ModuleId;
                u.ModuleName = user.ModuleName;

                UserManagerDashboard.GridUsers.users.Add(u);
            }
        }
    }
    catch (Exception ex)
    {
    }
}

这是一个非常直接的方法。使用实体框架连接到数据库,从“vw_usermanager_users”视图获取所有用户,并填充作为集合一部分的对象


我将?int转换为int,并将属性更改为?int,因此不需要转换。我知道这将需要更长的时间,因为我正在循环浏览记录。但是否可以通过关闭更改跟踪来加快查询速度?

是的:

var q = from u in GenesisOnlineEnties.vw_UserManager_Users.AsNoTracking()
   select u;
除非使用实体上的所有属性,否则也只能选择所需的列

var q = from u in GenesisOnlineEnties.vw_UserManager_Users.AsNoTracking()
   select new User
   {
       UserId = u.UserId,
       ...
   }

是,通过关闭更改跟踪:

var q = from u in GenesisOnlineEnties.vw_UserManager_Users.AsNoTracking()
   select u;
除非使用实体上的所有属性,否则也只能选择所需的列

var q = from u in GenesisOnlineEnties.vw_UserManager_Users.AsNoTracking()
   select new User
   {
       UserId = u.UserId,
       ...
   }

首先,你的vw_UserManager_Users对象是什么样子的?如果您正在引用的任何属性是导航属性:-

public partial class UserManager_User
{
  public string GroupName { get { return this.Group.Name; } }

  // See how the getter traverses across the "Group" relationship
  // to get the name?
}
然后,您可能会运行face first进入-基本上,您将在数据库中查询一次用户列表,然后为每个用户查询一次(或多次)以加载关系。有些人在遇到问题时会想“我知道,我会使用O/RM”。现在他们有N+1个问题

最好使用查询投影:-

var q = from u in GenesisOnlineEnties.vw_UserManager_Users
        select new User()
        {
          UserID = u.UserId,
          ApplicationId = u.ApplicationID,
          GroupName = u.Group.Name, // Does the join on the database instead
          ...
        };
这样,数据的形状就已经正确了,您只需跨线路发送实际需要的列

如果你想得到幻想,你可以使用做查询投影为你;节省了一些冗长的内容-尤其是在多个位置进行投影时:-

var q = GenesisOnlineEnties.vw_UserManager_Users.Project().To<User>();
或:-

或者可能:-

UserManagerDashboard.GridUsers = new MyGrid(q.ToList());
现在将用户添加到网格的方式就像将沙子从一个桶移动到另一个桶,每次移动一粒。如果你正在制作一个桌面应用程序,那就更糟糕了,因为向网格中添加一个项目可能会触发UI的重新绘制(即,一次一粒,然后在每次之后向你的好友描述桶中的每一粒)。无论是哪种方式,如果您正在做不必要的工作,请查看网格为您提供了哪些方法来避免这种情况

表中有多少用户?如果这个数字非常大,那么您需要分页显示结果。确保分页发生在数据库上,而不是在获得所有数据之后,否则会有点达不到目的:-

q = q.Skip(index).Take(pageSize);
尽管要记住,有些网格与
IQueryable
交互以进行开箱即用的分页,但在这种情况下,您只需将
q
直接传递到网格


这些是显而易见的。如果这不能解决您的问题,请发布更多的代码,我将深入研究。

好的,首先,您的vw\u UserManager\u用户对象是什么样子的?如果您正在引用的任何属性是导航属性:-

public partial class UserManager_User
{
  public string GroupName { get { return this.Group.Name; } }

  // See how the getter traverses across the "Group" relationship
  // to get the name?
}
然后,您可能会运行face first进入-基本上,您将在数据库中查询一次用户列表,然后为每个用户查询一次(或多次)以加载关系。有些人在遇到问题时会想“我知道,我会使用O/RM”。现在他们有N+1个问题

最好使用查询投影:-

var q = from u in GenesisOnlineEnties.vw_UserManager_Users
        select new User()
        {
          UserID = u.UserId,
          ApplicationId = u.ApplicationID,
          GroupName = u.Group.Name, // Does the join on the database instead
          ...
        };
这样,数据的形状就已经正确了,您只需跨线路发送实际需要的列

如果你想得到幻想,你可以使用做查询投影为你;节省了一些冗长的内容-尤其是在多个位置进行投影时:-

var q = GenesisOnlineEnties.vw_UserManager_Users.Project().To<User>();
或:-

或者可能:-

UserManagerDashboard.GridUsers = new MyGrid(q.ToList());
现在将用户添加到网格的方式就像将沙子从一个桶移动到另一个桶,每次移动一粒。如果你正在制作一个桌面应用程序,那就更糟糕了,因为向网格中添加一个项目可能会触发UI的重新绘制(即,一次一粒,然后在每次之后向你的好友描述桶中的每一粒)。无论是哪种方式,如果您正在做不必要的工作,请查看网格为您提供了哪些方法来避免这种情况

表中有多少用户?如果这个数字非常大,那么您需要分页显示结果。确保分页发生在数据库上,而不是在获得所有数据之后,否则会有点达不到目的:-

q = q.Skip(index).Take(pageSize);
尽管要记住,有些网格与
IQueryable
交互以进行开箱即用的分页,但在这种情况下,您只需将
q
直接传递到网格


这些是显而易见的。如果这不能解决您的问题,请发布更多的代码,我将深入研究。

旁注:不要
catch(Exception ex){}
。你以后会后悔的!旁注:不要
捕获(例外情况除外){}
。你以后会后悔的!谢谢你的建议。我会让你知道你的建议进展如何。谢谢你的建议。我会让你知道你的建议如何。