Вернуть список элементов, которых НЕТ в двух предыдущих списках - PullRequest
0 голосов
/ 04 августа 2020

У меня есть 2 списка идентификаторов, и мне нужно вернуть список с продуктами, которых нет ни в одном из этих списков:

 public IEnumerable<Produto> GetProdutosIdNotInFamily(Guid produtoId)
        {
            var produtosPai = GetListaPaisId(produtoId);

            var produtosFilho = GetListaFilhosId(produtoId);

            
            var prod = _dbContext.Produtos
                         .Where(u => !produtosPai.Any(p => p.ProdutoFilhoId == u.Id)
                               && !produtosFilho.Any(p => p.ProdutoFilhoId == u.Id));

            return prod;
        }

1 Ответ

0 голосов
/ 04 августа 2020

Вы можете сделать это двумя способами: один - используя Contains, а другой - Any, как вы указали в своем фрагменте в сообщении.

Используя Contains Method

Если вы хотите использовать метод Contains(), вы, возможно, извлекаете все идентификаторы продуктов в коллекцию и применяете LINQ поверх нее и получаете список, который не является частью обоих ваших списков ссылок. Пример кода показан ниже.

// This is the sample model I am dealing with
public class Dummy
{
    public int Id { get; set; }
    public string Name { get; set; }
}

// Assuming the below call returns list of 'Dummy' objects
var products = _dbContext.Produtos;

// list1 & list2 are populated in your case already through the method calls
var exclusionList1 = list1.Select(x => x.Id).ToList<int>();
var exclusionList2 = list2.Select(x => x.Id).ToList<int>();

var myList = products.Where(x => !exclusionList1.Contains(x.Id) && !exclusionList1.Contains(x.Id)).ToList();

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

Использование Any

Как и Where, Any является методом расширения. В качестве параметра требуется делегат, который дает вам большую гибкость и контроль в отношении того, что вы хотите делать.

Применение Any к вашему сценарию показано ниже:

var products = _dbContext.Produtos;

var exclusionList1 = GetListaPaisId(produtoId);
var exclusionList2 = GetListaFilhosId(produtoId);

var prod = _dbContext.Produtos.Where(x => !exclusionList1.Any(z => x.Id == z.Id) && 
!exclusionList2.Any(z => x.Id == z.Id)).ToList();

Вы можете выбрать свой подход в зависимости от контекста, в котором вы выполняете эту операцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...