Search code examples
c#asp.net-web-apifull-text-searchlinq-to-entities

ASP.NET Web API searching multiple tables


I have a search function that searches for a specific word in two related tables and one unrelated table. Owner table and Registration table are related, and Vehicle table has no relations to the other two tables. I've tried multiple ways of approaching this problem, but non of them have worked. Below is the code in question.

What I have tried so far was placing three tables within a ViewModel and called it within my controllers search method.

Owner Table
public int OwnerId {get;set;}
public string FirstName {get;set;}
public string LastName {get;set;}

Registration Table
public int RegistrationId {get; set;}
public DateTime RegisteredDate {get; set;}
public string RegistrationLocation {get;set;}
public int OwnerId {get;set;}

Vehicle Table
public int VehicleId {get;set;}
public string VehicleName {get;set;}
public DateTime VehicleYear {get;set;}
public string Model {get;set;}

SearchViewModel

public IEnumerable<Owner> Owners {get;set;}
public IEnumerable<Registration> Registrations {get;set;}
public IEnumerable<Vehicle> Vehicles {get;set;}

Controller

[HttpGet]
 public SearchViewModel Search(string searchString)
{ 
   SearchViewModel searchVM = new SearchViewModel();
   searchVM.Owner = searchVM.Owner.Where(o => o.FirstName.Contains(searchString));
   searchVM.Registration = searchVM.Registration.Where(r => r.RegistrationLocation.Contains(searchString));
   searchVM.Vehicle = searchVM.Vehicle.Where(v => 
   v.Model.Contains(searchString));

   return searchVM;
}

Another way I've tried is:

[HttpGet]
 public IActionResult Search(string searchString)
{ 

 var owner = from owners in _context.Owner select owners; 
 var registration = from registrations in _context.Registration select 
 registrations; 
 var vehicle = from vehicles in _context.Vehicle select vehicles; 


   owner = owner.Where(o => o.FirstName.Contains(searchString));
   registration = registration.Where(r => 
   r.RegistrationLocation.Contains(searchString));
   vehicle = vehicle.Where(v => 
   v.Model.Contains(searchString));

   return Ok(); //I'm not sure how to return the three.
}

Solution

  • Combine your two attempts. In the first attempt you're building a view model, but not querying the database. In the second attempt you're querying the database, but not building a view model. Do both.

    For example:

    var searchVM = new SearchViewModel();
    
    searchVM.Owners = _context.Owner.Where(o => o.FirstName.Contains(searchString));
    searchVM.Registrations = _context.Registration.Where(r =>  r.RegistrationLocation.Contains(searchString));
    searchVM.Vehicles = _context.Vehicle.Where(v => v.Model.Contains(searchString));
    
    return searchVM;