我有两个 IQueryable:
成分:
IngId
Description
可用成分:
IngId
我已经有一个 IQueryable for Ingredient:
var ingQuery = from i in context.Ingredients
select i;
我如何向他添加一个联接,以便它按
AvailableIngredient
进行过滤(即内部联接)?如果我必须一直加入,即从... join context.Available ... 等),我知道该怎么做,但加入是有条件的,所以我需要使用其他语法:
if (filterByAvailable)
{
IQueryable<Available> availableQuery = GetAvailableIngredientQuery(context);
ingQuery = ingQuery.Join(...); // Can I use this to join to the query?
}
这可能不是正确的方法,所以这就是我想做的:
编辑:
这是我当前正在使用的代码(非常快),但这意味着重复的代码:
IQueryable<Ingredient> query;
if (filterByAvailable)
{
IQueryable<Available> availableQuery = GetAvailableIngredientQuery(context);
query = from item in context.Ingredients
// Quite a few `where` clauses and stuff
join t in availableQuery on item.IngId equals t.IngId
select item;
}
else
{
query = from item in context.Ingredients
// The SAME `where` clauses and stuff as above
select item;
}
使用第一个查询作为后续查询的来源。
IQueryable<Ingredient> query = from item in context.Ingredients
// Quite a few `where` clauses and stuff
select item;
if (filterByAvailable)
{
IQueryable<Available> availableQuery = GetAvailableIngredientQuery(context);
query = from item in query
join t in availableQuery on item.IngId equals t.IngId
select item;
}
我已经使用Where子句实现了分页逻辑,任何人都可以将其用于分页和其他目的。
ResponseDTO 响应 = 新 ResponseDTO
();
var requests = (from r in _context.Requests.Where(x => x.IsActive && x.EmployeeId == search.EmployeeNumber && x.ServiceId == search.ServiceId)
join s in _context.Services
on r.ServiceId equals s.Id
join b in _context.RequestStatus
on r.RequestStatusId equals b.RequestStatusId
select new GetRequestHistoryDto
{
Id = r.Id,
ReferenceNumber = r.ReferenceNumber,
ServiceId = r.ServiceId,
ServiceNameEn = s.NameEn,
ServiceNameAr = s.NameAr,
RequesterId = r.RequesterId,
RequestStatusId = r.RequestStatusId,
RequestStatusName = b.RequestStatusEn,
CreatedOn = r.CreatedOn
});
if (requests != null)
{
if (!string.IsNullOrEmpty(search.SearchKey))
{
requests = requests.Where(x => x.ReferenceNumber.ToLower().Contains(search.SearchKey.ToLower())
|| x.ServiceId.ToString().Contains(search.SearchKey)
|| x.ServiceNameEn.ToString().ToLower().Contains(search.SearchKey.ToLower())
|| x.ServiceNameAr.ToString().ToLower().Contains(search.SearchKey.ToLower())
|| x.RequesterId.ToString().ToLower().Contains(search.SearchKey.ToLower())
|| x.RequestStatusName.ToString().ToLower().Contains(search.SearchKey.ToLower()));
}
if (search.IsSortDesc)
{
requests = requests.OrderByDescending(e => e.CreatedOn);
}
else
{
requests = requests.OrderBy(e => e.CreatedOn);
}
}
response.TotalRecords = requests.Count();
if (search.pageNumber > 0 && search.pageSize > 0)
{
requests = requests.Skip((search.pageNumber - 1) * search.pageSize).Take(search.pageSize);
}
requests = requests.OrderByDescending(x => x.CreatedOn);
response.Data = await requests.ToListAsync();