Запрос общих контактов (отношения «многие ко многим») в рамках сущности - PullRequest
1 голос
/ 30 ноября 2010

У меня есть этот классический сценарий, где у меня есть таблица User и таблица Contact, содержащая только столбцы UserId и ContactId (так что это отношение многие ко многим отношениям). То, что я хотел бы, это запрос, который дает мне список идентификаторов пользователей с количеством общих контактов с указанным пользователем. В простом старом SQL у меня есть следующий запрос (контакты пользователя и самого пользователя отфильтрованы, чтобы получить Facebook как предложения друзей):

SELECT COUNT(c1.ContactId) as CommonContact, c2.UserId
from Contacts as c1
inner join Contacts as c2 on c1.ContactId = c2.ContactId
Where c1.UserId = @Id AND c2.UserId != @Id 
AND c2.UserId NOT IN (SELECT ContactId from Contacts Where UserId = @Id)
Group By c2.UserId
ORDER BY CommonContact Desc 

Этот простой запрос прекрасно работает, но я не могу понять, как написать тот же запрос в LINQ to Entity, потому что в модели Entity Framework у меня есть сущность User, у которой есть свойство навигации Contact, но таблицы соединений там нет. ...

Большое спасибо за любую помощь ...

1 Ответ

0 голосов
/ 23 июля 2013

Не было времени и попытаться запустить его, но что-то вроде этого должно работать.

public class Test
    {
        //simulate an IQueryable
        private readonly IQueryable<Person> _people = new List<Person>().AsQueryable();

        public void FindContactMatchCount(Guid personId)
        {
            //we'll need the list of id's of the users contacts for comparison, we don't need to resolve this yet though so 
            //we'll leave it as an IQueryable and not turn it into a collection
            IQueryable<Guid> idsOfContacts = _people.Where(x => x.Id == personId).SelectMany(x => x.Contacts.Select(v => v.Id));

            //find all the people who have a contact id that matches the selected users list of contact id's
            //then project the results, this anonymous projection has two properties, the person and the  contact count
            var usersWithMatches = _people
                .Where(x => idsOfContacts.Contains(x.Id))
                .Select(z => new
                    {
                        Person = z, //this is the person record from the database, we'll need to extract display information
                        SharedContactCount = z.Contacts.Count(v => idsOfContacts.Contains(v.Id)) //
                    }).OrderBy(z => z.SharedContactCount)
                .ToList();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...