Запрос членства с использованием Linq - PullRequest
2 голосов
/ 29 апреля 2010

Я не опытный программист, мне нужно запросить коллекцию пользователей, предоставленную в asp.net mvc.

Я хочу, чтобы участники могли добавлять других участников в друзья, я создал добавленную таблицу друзей.

Id, ID пользователя, Friend_MemberId, DateAdded

Я хочу отобразить список участников, которые не добавлены в этот список (например, отфильтровать уже существующих друзей), но не могут выполнить запрос с помощью linq, может кто-нибудь предложить способ, ссылки, статьи, было бы лучше расширить членство класс.

1 Ответ

0 голосов
/ 29 апреля 2010

Существует множество способов сделать это.

Давайте рассмотрим один из них.

Рабочее решение 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
...