Il y a plusieurs façons de procéder.
Examinons un.
Vous pouvez télécharger la solution VS2008 en cours de fonctionnement here. L'exemple n'est pas un projet MVC, mais le fournisseur d'appartenances fonctionne de la même manière.
Stipulations:
- Vous utilisez SqlProviders par défaut par défaut
- Vous savez comment ajouter un modèle ADO.Net entité utilisant le ASPNETDB
- Votre ASPNETDB sert une application, la valeur par défaut '/'. Si ce n'est pas le cas, vous aurez déjà les connaissances nécessaires pour ajuster les conseils suivants.
Créer la table des amis dans le ASPNETDB:
Ce qui suit suppose que vous utilisez la valeur par défaut ASPNETDB qui est créé dans App_Data. Si non, alors vous avez déjà créé et connecté à une autre base de données, prenez juste ce dont vous avez besoin.
Sélectionnez votre projet dans l'Explorateur de solutions, cliquez sur "afficher tous les fichiers de l'icône en haut de l'Explorateur de solutions, développez le dossier « App_Data » et clic droit> Ouvrir ASPNETDB.mdf.
Dans l'Explorateur de serveur, vous verrez votre ASPNETDB.
Projet> Ajouter un nouvel élément> Fichier texte> Friends.sql
Coller requête ci-dessous. Sauvegarder.
clic droit dans l'éditeur> Connexion> Se connecter> sélectionnez ASPNETDB
clic droit dans l'éditeur> Exécuter 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
Ajouter un ADO.Modèle de données Net Entité à votre projet et comprennent, au minimum, ce qui suit:
Tables
Vues
- vw_aspnet_MembershipUsers
Exemple de requête:
NOTE: Je ne suis en aucun cas un gourou Linq. Ces requêtes fonctionnent bien et le sql généré ne me semble pas déraisonnable, mais je suis sûr qu'il y a quelqu'un qui aura des suggestions utiles concernant les optimisations possibles des requêtes.
// 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
Un progrès sur celui-ci? –