我经常发现自己需要一些用户数据,例如用户名,配置文件属性以及我数据库中其他表的其他数据,其中表与UserId(guid)有关。请解释一下:
aspnet_Users table:
UserId
username
...
Some table from which I retrive data:
Id
Post
DateTime
UserId
...
因此,对于我拉的每个帖子(通常超过20个)我需要每个帖子的用户名。打电话似乎是昂贵的交易:
string username = Membership.GetUser(UserID).UserName;
每个项目。好像我正在对数据库进行20次额外调用。这样做的正确方法是什么?我应该在我的Linq to Sql方案中包含aspnet_Users表然后加入以便我可以一次拉它吗?
答案 0 :(得分:2)
我是否应该在我的Linq to Sql方案中包含aspnet_Users表然后加入以便我可以一次提取它?
是的,至少就是我这样做的方式。
另一种选择是创建一个字典并将所有用户存储在那里并在内存中进行查找,但在这种情况下,您需要监控用户的更改,以便连接似乎更容易解决。
答案 1 :(得分:1)
你不必。至少有两种可能的方法。
首先,您可以拥有一个自定义成员资格提供程序,它使用您自己的数据库和数据库中的自定义表。这样您就不会处理两个数据库,也不必执行其他调用。
其次,如果您希望坚持使用SqlMembershipProvider
数据库的内置aspnetdb
,因此您有两个数据库 - 用户数据库和应用程序数据库,您可以创建链接服务器/同义词从您的应用程序数据库到aspnetdb
数据库。 sqlmetal.exe
存在一个小问题,导致它无法生成链接表的linq2sql模型,但您可以为两个数据库创建模型,然后将它们放在同一名称空间中:
http://netpl.blogspot.com/2008/06/linq-and-synonyms-linked-servers.html
通过这种方式,您将拥有数据库和链接表的linq2sql模型,这将允许您跨数据库创建连接。在您的场景中,它意味着使用单个linq2sql语句来检索具有用户名的帖子。