I asked something similar recently and it got solved by using AsQueryable: How to save time when pulling data from DB using Entity Framework Core in controller with paging?
On top of that, I am wondering if it is possible to filter one dbcontext object data using different dbcontext data using code below:
public IActionResult Index(string sortOrder, string currentFilter, string searchString, int? page)
{
var allRequests = _context.Request
.Where(r => r.Status != "Closed").ToList();
// apply filters to query
var myRequests = allRequests
.Where(ar => GetEmailsByRequestId(ar.RequestId).Contains("[email protected]") == true)
.ToList();
var result = myRequests.Select(mr => new CreateRequestViewModel
{
RequestId = mr.RequestId,
// ... other fields
});
// Return the PaginatedList using ViewModel List created above with paging to the page.
return View(PaginatedList<CreateRequestViewModel>.CreateAsync(result, page ?? 1, pageSize));
}
public string GetEmailsByRequestId(string requestId)
{
string result = string.empty;
var emails = (from e in _marketingDBContext.Email
where e.ClientRequestId == requestId
select new
{
Email = e.EmailAddress
}
).ToList();
// Logic to convert emails List to string
...
return result;
}
As you can see the Index action has the first _context entity, but it needs to be filtered using second entity marketingDBContext in the GetEmailsByRequestId method.
My current code would have to get all the data from _context first, then filter to return requests having email address equals to [email protected] only from marketingDBContext. I assume it would take a long time if the data grows. As it will scan each record in allRequests to apply the filter.
Not sure if there is any way I can combine the filtering logic?
Thanks in advance.
You have to filer by Ids returned by marketingDBContext.