2010-04-29 58 views
2

我不是一個有經驗的程序員,我需要查詢在asp.net mvc的提供的會員用戶採集。會員查詢使用LINQ

我希望成員能夠將其他成員添加爲朋友,我創建了一個添加的朋友表。

標識, 成員Id, Friend_MemberId, DateAdded

我想顯示未添加到這個列表(如過濾器已經存在的朋友)成員的名單,但無法使用LINQ查詢,任何人都可以建議一種方式,鏈接,文章,延長美世紀班會更好嗎?

+0

在這一個方面有何進展? – 2010-05-02 13:40:59

回答

0

有相當數量的方式,你可以去這個問題。

讓我們來看看一個。

您可以下載工作VS2008解決方案here。該示例不是MVC項目,但成員資格提供程序的工作原理是相同的。

規定:

  • 您正在使用默認的缺省SqlProviders
  • 你知道如何使用ASPNETDB
  • 你ASPNETDB提供一個應用程序,默認的 '/' 添加一個ADO.Net實體模型。如果情況並非如此,那麼您已經擁有必要的知識來調整以下指導。

在ASPNETDB創建好友表:

以下假定您使用的是在app_data文件創建的默認ASPNETDB。如果沒有,那麼你已經創建並連接到另一個數據庫,只需要你需要的。

  • 選擇在Solution Explorer中的項目,點擊「顯示所有文件」,在Solution Explorer中的頂部圖標,依次展開「App_Data文件」文件夾,右鍵單擊>打開ASPNETDB.MDF。

  • 在服務器資源管理器中,您將看到您的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。網絡實體數據模型到您的項目,包括,至少,以下內容:

  • 朋友

查看

  • vw_aspnet_MembershipUsers

查詢示例:

注意:我決不是Linq guru。這些查詢工作正常,生成的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