Обнаружение дублированного набора идентификаторов в сгруппированной коллекции - PullRequest
1 голос
/ 15 октября 2019

У меня есть следующие классы:

public class ExistingProposal
{
    public Guid ProposalIdPK { get; set; }
    public int StatusCode { get; set; }
    public List<ExistingProposalElement> GoldenRecordElements { get; } = new List<ExistingProposalElement>();
}

public class ExistingProposalElement
{
    public Guid ProposalElementIdPK { get; set; }
    public Guid ProposalIdFK { get; set; } // foreignkey referencing ExistingProposal.ProposalIdPK
}

Эти классы инициализируются с существующими предложениями и их элементами. Предложение будет иметь различные коды состояния, такие как «Принят», «Отклонено» и т. Д.

При создании новых предложений и элементов мне нужно проверить, есть ли уже предложение, содержащее такие же элементы, как новые

Итак, давайте предположим следующую ситуацию:

ExistingProposal    ExistingProposalElement
1                   1
                    2
                    3
2                   5
                    6
                    7

Теперь необходимо создать новое предложение с элементами, например, с идентификаторами 5,6 и 7. Моя проверка теперь должна обнаружить, что уже естьпредложение с этими идентификаторами.

Новые идентификаторы ProposalElement содержатся в

List<Guid> newElements

Как я могу обнаружить, что уже существует предложение, содержащее те же идентификаторы ProposalElement, которые содержатся в моем Списке«newElements» и конкретный «StatusCode»?

Я предполагаю, что это будет связано с методом Linq «All» или аналогичным, но я действительно застрял с ним, так как я не очень продвинут в Linq.

Любая помощь будет очень признательна.

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Я советую использовать SelectMany, поскольку я вас правильно понимаю .. Это проще, чем другие решения.

var existingItemsWithStatusCode = existingProposals.SelectMany(s => s.GoldenRecordElements,
                    (s, p) => new { s.ProposalIdPK, s.StatusCode, p.ProposalElementIdPK })
                .Where(w => newProposals.SelectMany(s => s.GoldenRecordElements.Select(t => t.ProposalElementIdPK))
                    .Contains(w.ProposalElementIdPK)).Select(s=>new
                {
                    s.ProposalElementIdPK,s.StatusCode
                }).ToList();

var newItems = existingProposals.SelectMany(s => s.GoldenRecordElements,
                    (s, p) => new {s.ProposalIdPK, s.StatusCode, p.ProposalElementIdPK})
                .Where(w => !newProposals.SelectMany(s => s.GoldenRecordElements.Select(t => t.ProposalElementIdPK))
                    .Contains(w.ProposalElementIdPK)).ToList();
0 голосов
/ 15 октября 2019

Вот фиктивные классы, которые я настроил, чтобы проверить это. Я настроил два предоставленных вами примера, а затем новое предложение, чтобы проверить, что оно уже существует.

var existingProposal1 = new ExistingProposal
{
    Id = 1,
    GoldenRecordElements = new List<ExistingProposalElement>
    {
        new ExistingProposalElement{ Id = 1 },
        new ExistingProposalElement{ Id = 2 },
        new ExistingProposalElement{ Id = 3 },
    }
};

var existingProposal2 = new ExistingProposal
{
    Id = 2,
    GoldenRecordElements = new List<ExistingProposalElement>
    {
        new ExistingProposalElement{ Id = 4 },
        new ExistingProposalElement{ Id = 5 },
        new ExistingProposalElement{ Id = 6 },
    }
};

List<ExistingProposal> existingProposals = new List<ExistingProposal>
{
    existingProposal1,
    existingProposal2
};

var newElements = new List<int> { 1, 2, 3 };

Этот код должен сообщить вам, если он уже существует.

var exists = existingProposals.Any(x => x.GoldenRecordElements
     .Select(y => y.Id)
     .Intersect(newElements).Count() == x.GoldenRecordElements.Count());
...