2010-04-29 5 views
2

Je ne suis pas un programmeur expérimenté, j'ai besoin d'interroger la Collection d'utilisateurs d'adhésion fournie dans asp.net mvc.Requête d'appartenance à l'aide de Linq

Je veux que les membres puissent ajouter d'autres membres comme amis, j'ai créé une table d'amis ajoutée.

Id, MemberID, Friend_MemberId, DateAdded

Je veux afficher une liste des membres qui ne sont pas ajoutés à cette liste (comme filtre amis déjà existants), mais incapable d'interroger LINQ, quelqu'un peut-il suggérer un moyen, des liens, des articles, serait-il préférable d'étendre la classe des membres.

+0

Un progrès sur celui-ci? –

Répondre

0

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

  • Amis

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