c# - 如何通过两个单独的控制器方法访问单个数据库查询的结果
问题描述
我实现了对我的网站的搜索。它有两个主要的实体客户和企业组。它们可以相互连接,我在它们的多个属性中对它们执行搜索以查找字符串。
对控制器的调用是从两个单独的 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);
}
解决方案
推荐阅读
- python - 如何访问 Pepper 的数据库
- android - Firebase 错误:java.lang.NoSuchMethodError:Lcom/google/firebase/messaging/ 类中没有虚拟方法 subscribeToTopic(Ljava/lang/String;)V
- google-cloud-platform - Bigquery 使用 UNNEST 提取嵌套的 JSON
- sql - “会话”事件流
- android - 如何将 Wordpress 网站帖子集成到我的网站 Android 应用程序中
- eclipse - 如何导入gradle项目
- mysql - Python脚本没有从mysql中删除
- log4j - 日志文件未创建:log4j
- javascript - 如何使国际化更改 js 文件以发出警报
- css - vue-router:如何禁用 router-link 的 css 的大纲属性作为