Вы можете сделать это двумя способами: один - используя 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();
Вы можете выбрать свой подход в зависимости от контекста, в котором вы выполняете эту операцию.