Я реализовал поиск по моему сайту.У него есть две основные группы лиц: клиенты и бизнес.Они могут быть связаны друг с другом, и я выполняю поиск по обоим строкам по ряду свойств каждого.
Вызов контроллера состоит из двух отдельных функций ajax и двух отдельных действий, а результаты помещаются в таблицы данных черезРезультат JSON.
Я думал о запуске этих двух строк только один раз:
var clients = GetClientsBySearchString(searchString, practiceId);
var businesses = GetBusinessesBySearchString(searchString, practiceId);
Каков наилучший способ добиться этого?
Вот мой контроллер SearchResultsController.cs
public class SearchResultsController : Controller
{
private readonly IUnitOfWork _unitOfWork;
public SearchResultsController(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
public ActionResult Index(string searchString)
{
ViewBag.SearchString = searchString;
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SearchBusinesses(string searchString)
{
if (String.IsNullOrEmpty(searchString))
return new EmptyResult();
var practiceId = _unitOfWork.Users.GetPracticeIdForUser(User.Identity.GetUserId());
var result = Json(_unitOfWork.SearchResults.GetBusinessesSearchResults(searchString, practiceId)
.Select(Mapper.Map<Business, BusinessDto>));
result.MaxJsonLength = int.MaxValue;
return result;
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SearchClients(string searchString)
{
if (String.IsNullOrEmpty(searchString))
return new EmptyResult();
var practiceId = _unitOfWork.Users.GetPracticeIdForUser(User.Identity.GetUserId());
var result = Json(_unitOfWork.SearchResults.GetClientsSearchResults(searchString, practiceId)
.Select(Mapper.Map<Client, ClientDto>));
result.MaxJsonLength = int.MaxValue;
return result;
}
}
Вот скрипт в Index.cshtml :
@section scripts
{
<script>
$(document).ready(function () {
function getToken() {
return $("[name='__RequestVerificationToken']").attr('value');
}
var tableClients = $('#clients').DataTable({
ajax: {
url: '/searchresults/searchclients?searchString=' + $('#search-results').attr('data-search-string'),
dataSrc: '',
deferRender: true,
method: 'POST',
data: { __RequestVerificationToken: getToken() },
},
columns: [
{
data: 'Reference'
},
{
data: 'Name',
render: function (data, type, client) {
return '<a href="/clients/clients/details/' + client.Id + '">' + client.Surname + ' ' + client.FirstName + '</a>';
}
},
{
data: 'Email',
render: function (data, type, client) {
return '<a href="mailto:' + client.Email + '">' + client.Email + '</a>';
}
}
]
});
var tableBusinesses = $('#businesses').DataTable({
ajax: {
url: '/searchresults/searchbusinesses?searchString=' + $('#search-results').attr('data-search-string'),
dataSrc: '',
method: 'POST',
data: { __RequestVerificationToken: getToken() },
},
columns: [
{
data: 'Reference'
},
{
data: 'Name',
render: function (data, type, business) {
return '<a href="/businesses/businesses/details/' + business.Id + '">' + business.Name + '</a>';
}
}
]
});
});
</script>
}
и, наконец, хранилище SearchResultRepository.CS
public class SearchResultRepository : ISearchResultRepository
{
private readonly ElmboardDbContext _context;
public SearchResultRepository(ElmboardDbContext context)
{
_context = context;
}
private IQueryable<Business> GetBusinessesBySearchString(string searchString, int practiceId)
{
return _context.Businesses.Where(b => [...].Contains(searchString)));
}
private IQueryable<Client> GetClientsBySearchString(string searchString, int practiceId)
{
return _context.Clients.Where(c => [...].Contains(searchString)));
}
public IEnumerable<Business> GetBusinessesSearchResults(string searchString, int practiceId)
{
var clients = GetClientsBySearchString(searchString, practiceId);
var businesses = GetBusinessesBySearchString(searchString, practiceId);
var relatedBusinesses =
from c in clients
join cbr in _context.ClientBusinessRelationships on c.Id equals cbr.ClientId
join b in _context.Businesses on cbr.BusinessId equals b.Id
select b;
return businesses.Union(relatedBusinesses);
}
public IEnumerable<Client> GetClientsSearchResults(string searchString, int practiceId)
{
var clients = GetClientsBySearchString(searchString, practiceId);
var businesses = GetBusinessesBySearchString(searchString, practiceId);
var relatedClientsByClient =
from c1 in clients
join ccr in _context.Client1Client2Relationships on c1.Id equals ccr.Client1Id
join c2 in _context.Clients on ccr.Client2Id equals c2.Id
select c2;
var relatedClientsByBusiness =
from b in businesses
join cbr in _context.ClientBusinessRelationships on b.Id equals cbr.BusinessId
join c in _context.Clients on cbr.ClientId equals c.Id
select c;
return clients.Union(relatedClientsByClient).Union(relatedClientsByBusiness);
}