【发布时间】:2022-01-07 01:40:52
【问题描述】:
您好,我有一个订单列表,这些订单有一个名为“推荐链接”的属性,以及一个链接到该订单的用户 ID,我被要求查询某个日期的所有订单具有推荐链接或用户进行的第一个订单具有推荐链接的范围。 目前,这是我的尝试,但是当我调试告诉我这不能转换为 SQL 时,这给了我一个异常。
public async Task<List<Order>> GetOrdersForRevenueReportFromMarketingTeam(RevenueReportDatesRequest dates)
{
var orders = Table.AsQueryable();
var query =
from o in orders
.Include(o => o.ReferralLink)
from first in orders
.Where(first => first.UserId == o.UserId)
.OrderBy(first => first.CreatedDate)
.Take(1)
.DefaultIfEmpty()
where
o.ReferralLink != null||
first.Status.Contains("refunded") == false &&
first.Fulfilled == true &&
first.ReferralLink != null &&
o.CreatedDate >= dates.StartDate &&
o.CreatedDate <= dates.EndDate &&
o.Fulfilled == true &&
o.Status.Contains("refunded") == false
select o;
return query.ToList();
}
我将不胜感激!
更新** 我已将代码更新为我现在的代码,因为我认为它会有所帮助,英语也不是我的第一语言,如果我让它有点难以理解,我深表歉意。
这个想法是检查 OR 条件,就像我现在正在做的那样,返回我想要的订单,这部分工作,但是,我想我可能需要一个 JOIN 语句,导致问题我有的是下一个,我需要没有推荐链接的订单,但是它的第一个用户的订单有,有第一个订单推荐链接,导致在查询这些订单的那一刻,有一个 ref 链接为空,因为查询只检查第一个是否有推荐链接。
为了进一步解释我在寻找什么,虽然我不喜欢它,因为我正在循环查询到 DB,但解决方法是使用我收到的订单列表进行下一步
foreach (var order in orderList)
{
if (order.ReferralLink == null)
{
var firstOrder = await _orderRepository.GetFirstOrderFromUser(order.UserId).ConfigureAwait(false);
order.ReferralLink = firstOrder.ReferralLink;
}
}
它将在日期范围内从该用户的订单中查询第一笔订单,然后将推荐链接与该第一笔推荐链接相等。
那么,有没有办法通过 join 或类似的方式将第一个订单的 ref 链接添加到具有 null 作为推荐链接但该用户的第一个订单没有的订单?
【问题讨论】:
-
哪个 EF 版本?
-
你为什么返回
List<List<Order>>?为什么不只是List<Order>? -
@SvyatoslavDanyliv 4.6.2 至于返回是因为这个返回的是列表列表,按用户ID分组的订单列表列表。
-
很好的答案,我可以按用户分组,但我看不出有任何理由这样做。