Использование LINQ в .Net 3.1 для получения всех элементов из таблицы базы данных, соответствующих списку идентификаторов.

У меня есть база данных SQL и проект ядра .Net 3.1, содержащий 3 таблицы, называемые членами, членством и клубами. Каждый участник уникален с уникальным MemberId и может состоять в нескольких клубах. Для каждого клуба, членом которого является член, у вас есть одна строка в таблице членства, которая содержит MemberId, ClubId и MembershipID.

Членство:

 

    |Id|MemberId|ClubId|
    ********************
    |1 |1       |1     |
    |1 |1       |2     |
    |2 |2       |2     |
    |3 |3       |3     |
    |3 |3       |2     |
    |3 |3       |1     |

Клубы:

 

    |Id|Name       |Subject|
    ************************
    |1 |Chess club |Chess  |
    |2 |Foxtrot    |Dance  |
    |3 |Paint club |Art    |

Участники:


    |Id|First Name |phone  |
    ************************
    |1 |Bob        |xxx    |
    |2 |Mandy      |yyy    |
    |3 |Joe        |zzz    |

У меня есть список, содержащий все идентификаторы клубов, которые должны совпадать. Теперь, используя Linq, я хотел бы получить всех участников, входящих в несколько клубов. Так, например, я хотел бы получить всех членов, которые являются частью шахматного клуба (идентификатор: 1) И клуба рисования (идентификатор: 3), поэтому со списком [1, 3] в этом случае только Джо.

Это довольно упрощенная версия псевдокода, но я надеюсь, что она поможет продемонстрировать, что я хочу сделать.

  

    memberships.Where(membership => membership.clubId == 1 AND membership.clubId == 3)

Это, очевидно, не работает, поскольку ни одна строка не соответствует этому, плюс я хочу, чтобы она была динамической со списком клубных идентификаторов.


    var memberClubData = [1,3]
    memberships.Where(membership => memberClubData.All(x => x == membership.clubId))

Я знаю, как вы можете сделать это с помощью SQL с подзапросом и подсчетом, но я полностью застрял, когда дело доходит до выполнения этого с помощью LINQ в С#.


person ChrisFromTheBlock    schedule 01.12.2020    source источник
comment
Обычно вы создаете список нужных вам элементов, например List‹int› findClubId = new List‹int›() {1,3}; Затем вы можете использовать findClubId.Contains(x) как часть вашего запроса.   -  person jdweng    schedule 01.12.2020
comment
@jdweng Когда я это делаю, я получаю всех, кто является частью clubId 1 или 3, хотя на самом деле мне нужны только люди, которые являются частью обоих клубов, они же Джо. Использование содержит, я получаю и Джо, и Боба, а не только Джо.   -  person ChrisFromTheBlock    schedule 01.12.2020


Ответы (2)


var query= from Member in Members where Memebers.Clubs.any(club=›club.Id==1 && club.Id==3) select Member

person ravipatel    schedule 01.12.2020

Попробуйте следующее:

           DataTable memberships = new DataTable();
            memberships.Columns.Add("Id", typeof(int));
            memberships.Columns.Add("MemberId", typeof(int));
            memberships.Columns.Add("ClubId", typeof(int));

            memberships.Rows.Add(new object[] { 1,1,1});
            memberships.Rows.Add(new object[] { 1,1,2});
            memberships.Rows.Add(new object[] { 2,2,2});
            memberships.Rows.Add(new object[] { 3,3,3});
            memberships.Rows.Add(new object[] { 3,3,2});
            memberships.Rows.Add(new object[] { 3,3,1});

            List<int> findClubId = new List<int>() {1,3};

            int[] memberClubData = memberships.AsEnumerable()
                .Select(x => new { id = x.Field<int>("Id"), clubId = x.Field<int>("ClubId") })
                    .GroupBy(x => x.id)
                    .Where(x => findClubId.All(y => x.Select(z => z.clubId).Contains(y)))
                    .Select(x => x.First().id)
                    .ToArray();
person jdweng    schedule 01.12.2020