Существует множество способов сделать это.
Давайте рассмотрим один из них.
Рабочее решение VS2008 можно загрузить здесь .Пример не является проектом MVC, но поставщик членства работает одинаково независимо.
Требования:
- Вы используете SqlProviders по умолчанию
- Вы знаете, какдобавьте модель сущности ADO.Net, используя ASPNETDB
- . Ваша ASPNETDB обслуживает одно приложение, по умолчанию «/».Если это не так, то у вас уже есть необходимые знания для настройки следующего руководства.
Создайте таблицу друзей в ASPNETDB:
В следующем предполагается, что вы используетеASPNETDB по умолчанию, который создается в app_data.Если нет, значит, вы уже создали и подключились к другой БД, просто возьмите то, что вам нужно.
Выберите проект в обозревателе решений, щелкните значок «Показать все файлы» в верхней частиВ обозревателе решений разверните папку «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.Net в свой проект и включите, как минимум, следующее:
Таблицы
Просмотры
- vw_aspnet_MembershipUsers
Пример запроса:
ПРИМЕЧАНИЕ: я ни в коем случае не гуру Линка.Эти запросы работают нормально, и сгенерированный 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