C# 遍历datacontext-最有效的方法?
我已经开始在visual studio 2012中使用性能向导,因为有一个缓慢的方法,基本上用于从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())
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){}
。你以后会后悔的!旁注:不要捕获(例外情况除外){}
。你以后会后悔的!谢谢你的建议。我会让你知道你的建议进展如何。谢谢你的建议。我会让你知道你的建议如何。