Фильтрация DbSet по содержимому IList с использованием LINQ - PullRequest
2 голосов
/ 20 марта 2020

У меня есть 2 поставщика ILists и VwSrmAhmSuppliers. Они оба запрашиваются из базы данных. Я сначала заполняю поставщиков. Затем, когда я запрашиваю VwSrmAhmSuppliers, я хочу отфильтровать результаты на основе того, что я уже извлек в поставщиках.

public IList<Supplier> Suppliers { get;set; }
public IList<Models.ExternalData.VwSrmAhmSupplier> VwSrmAhmSuppliers { get; set; }

public async Task OnGetAsync(Boolean? All)
{
   //don't show all records unless explicity asked to!
   if (All == true)
   {
      Suppliers = await _context.Supplier
         .Include(s => s.Status)
         .Include(c => c.Category)
         .Include(c => c.Comments)
         .OrderByDescending(c => c.CreateDate)
         .ToListAsync();

      //these do not work
      //VwSrmAhmSuppliers = await _externalcontext.VwSrmAhmSuppliers.Where(d => Suppliers.Any(s=>s.SupplierNo == d.AhmSupplierNo)).ToListAsync();
      //VwSrmAhmSuppliers = await _externalcontext.VwSrmAhmSuppliers.Where(v => Suppliers.Any(s=> s.SupplierNo.Equals(v.AhmSupplierNo))).ToListAsync();

      //This does work, it gets all suppliers but it's too many
      //VwSrmAhmSuppliers = await _externalcontext.VwSrmAhmSuppliers.ToListAsync();


      VwSrmAhmSuppliers = await _externalcontext.VwSrmAhmSuppliers
         .Where(v => Suppliers
            .Any(s => s.SupplierNo == v.AhmSupplierNo))
         .ToListAsync();
   }
}

Сгенерированная ошибка:

InvalidOperationException : Выражение LINQ «DbSet .Where (v => __Suppliers_0 .Any (s => s.SupplierNo == v.AhmSupplierNo))» не может быть переведено. Либо переписать запрос в форме, которую можно перевести, либо переключиться на оценку клиента явно, вставив вызов либо в AsEnumerable (), AsAsyncEnumerable (), ToList (), либо в ToListAsyn c (). См. https://go.microsoft.com/fwlink/?linkid=2101038 для получения дополнительной информации.

И мне это не понятно.

1 Ответ

3 голосов
/ 20 марта 2020

Сначала необходимо спроецировать в памяти коллекцию простых ссылочных типов (int, string et c.), А не список типа Supplier, а затем использовать его для * 1004. * или Contains условие, например:

Suppliers = await _context.Supplier
         .Include(s => s.Status)
         .Include(c => c.Category)
         .Include(c => c.Comments)
         .OrderByDescending(c => c.CreateDate)
         .ToListAsync();

//Project out the required references
var supplierNos = Suppliers.Select(s => s.SupplierNo).ToList();

//Use the simple reference type collection in your query
VwSrmAhmSuppliers = await _externalcontext.VwSrmAhmSuppliers
    .Where(d => supplierNos.Any(s=> s == d.AhmSupplierNo)).ToListAsync();

...