我不是一個有經驗的程序員,我需要查詢在asp.net mvc的提供的會員用戶採集。會員查詢使用LINQ
我希望成員能夠將其他成員添加爲朋友,我創建了一個添加的朋友表。
標識, 成員Id, Friend_MemberId, DateAdded
我想顯示未添加到這個列表(如過濾器已經存在的朋友)成員的名單,但無法使用LINQ查詢,任何人都可以建議一種方式,鏈接,文章,延長美世紀班會更好嗎?
我不是一個有經驗的程序員,我需要查詢在asp.net mvc的提供的會員用戶採集。會員查詢使用LINQ
我希望成員能夠將其他成員添加爲朋友,我創建了一個添加的朋友表。
標識, 成員Id, Friend_MemberId, DateAdded
我想顯示未添加到這個列表(如過濾器已經存在的朋友)成員的名單,但無法使用LINQ查詢,任何人都可以建議一種方式,鏈接,文章,延長美世紀班會更好嗎?
有相當數量的方式,你可以去這個問題。
讓我們來看看一個。
您可以下載工作VS2008解決方案here。該示例不是MVC項目,但成員資格提供程序的工作原理是相同的。
規定:
在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。網絡實體數據模型到您的項目,包括,至少,以下內容:
表
查看
查詢示例:
注意:我決不是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
在這一個方面有何進展? – 2010-05-02 13:40:59