使用Linq查询成员资格

时间:2010-04-29 11:53:39

标签: asp.net-mvc asp.net-membership

我不是一位经验丰富的程序员,我需要查询asp.net mvc中提供的Membership User Collection。

我希望成员能够将其他成员添加为朋友,我已经创建了一个添加好友表。

标识, 会员ID, Friend_MemberId, DateAdded

我想显示未添加到此列表的成员列表(如过滤已经存在的朋友),但无法使用linq查询,任何人都可以建议方式,链接,文章,扩展成员会更好吗?类。

1 个答案:

答案 0 :(得分:0)

有很多方法可以解决这个问题。

我们来看一个。

您可以下载有效的VS2008解决方案here。该示例不是MVC项目,但无论如何,成员资格提供程序的工作方式都相同。

规定:

  • 您使用的是默认默认SqlProviders
  • 您知道如何使用ASPNETDB
  • 添加ADO.Net实体模型
  • 您的ASPNETDB服务于一个应用程序,默认为“/”。如果情况并非如此,那么您将拥有调整以下指导所需的必要知识。

在ASPNETDB中创建Friends表:

以下假设您使用的是在app_data中创建的默认ASPNETDB。如果没有,那么您已经创建并连接到另一个数据库,只需要你需要的东西。

  • 在解决方案资源管理器中选择您的项目,点击解决方案资源管理器顶部的“显示所有文件”图标,展开“App_Data”文件夹,然后右键单击>打开ASPNETDB.MDF。

  • 在Server Explorer中,您将看到ASPNETDB。

  • 项目>添加新项目>文本文件> Friends.sql

  • 在下面粘贴查询。保存。

  • 右键单击编辑器>连接>连接>选择ASPNETDB

  • 右键单击编辑器>执行SQL

Friends.sql

/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Friends
    (
    Id int NOT NULL IDENTITY (1, 1),
    MemberId uniqueidentifier NOT NULL,
    Friend_MemberId uniqueidentifier NOT NULL,
    DateAdded datetime NOT NULL
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.Table1 ADD CONSTRAINT
    DF_Table1_DateAdded DEFAULT GetDate() FOR DateAdded
GO
ALTER TABLE dbo.Table1 ADD CONSTRAINT
    PK_Table1 PRIMARY KEY CLUSTERED 
    (
    Id
    ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO
ALTER TABLE dbo.Table1 ADD CONSTRAINT
    IX_Table1 UNIQUE NONCLUSTERED 
    (
    MemberId,
    Friend_MemberId
    ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO
ALTER TABLE dbo.Table1 SET (LOCK_ESCALATION = TABLE)
GO
COMMIT

将ADO.Net实体数据模型添加到您的项目中,并至少包含以下内容:

<强>表格

<强>视图

  • vw_aspnet_MembershipUsers

查询示例:

注意:我绝不是Linq大师。这些查询工作正常,生成的sql对我来说似乎并不合理,但我确信有人会就可能的查询优化提供有用的建议。

// there are 3 users: User1, User2 and User3

// User1 has one friend, User2

string username = "User1"; // this would be the User.Identity.Name (currently logged in user)

// 

vw_aspnet_MembershipUsers[] friends;
vw_aspnet_MembershipUsers[] notFriends;

using (var ctx = new ASPNETDBEntities())
{
    // get the userId
    Guid userId = ctx.vw_aspnet_MembershipUsers.First(m => m.UserName == username).UserId;




    var usersFriendsQuery = from friend in ctx.Friends
                            join muser in ctx.vw_aspnet_MembershipUsers on friend.Friend_MemberId equals muser.UserId
                            where friend.MemberId == userId
                            select muser;


    friends = usersFriendsQuery.ToArray();

    Debug.Assert(friends.Count()==1);
    Debug.Assert(friends[0].UserName=="User2");



    var usersNotFriendsQuery = from muser in ctx.vw_aspnet_MembershipUsers
                               where ctx.vw_aspnet_MembershipUsers.Any(m =>
                                   ctx.Friends.FirstOrDefault(friend =>
                                       // include self in excluded members
                                       (muser.UserId == userId)
                                       ||
                                           // include already friends in excluded members
                                       (friend.MemberId == userId && friend.Friend_MemberId == muser.UserId)
                                       ) == null)
                               select muser;


    notFriends = usersNotFriendsQuery.ToArray();

    Debug.Assert(notFriends.Count() == 1);
    Debug.Assert(notFriends[0].UserName == "User3");
}

// do something interesting with friends and notFriends here