【问题标题】:Get all Elements where the first element grouped by 'X' property has 'Y' value not null获取按“X”属性分组的第一个元素具有“Y”值不为空的所有元素
【发布时间】: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&lt;List&lt;Order&gt;&gt;?为什么不只是List&lt;Order&gt;
  • @SvyatoslavDanyliv 4.6.2 至于返回是因为这个返回的是列表列表,按用户ID分组的订单列表列表。
  • 很好的答案,我可以按用户分组,但我看不出有任何理由这样做。

标签: c# sql linq


【解决方案1】:

尝试以下查询。

将返回类型更改为Task&lt;List&lt;Order&gt;&gt;

public Task<List<Order>> GetOrdersForRevenueReportFromMarketingTeam(RevenueReportDatesRequest dates)
{
    var orders = Table.AsQueryable();

    var query = 
        from o in orders
        from first in orders
            .Where(first => first.UserId == o.UserId && first.ReferralLink != null)
            .OrderBy(first => 
                  first.CreatedDate >= dates.StartDate 
               && first.CreatedDate <= dates.EndDate ? 0 : 1)
            .ThenBy(first => first.CreatedDate)
            .Take(1)
            .DefaultIfEmpty()
        where first.ReferralLink != null &&
            o.CreatedDate >= dates.StartDate &&
            o.CreatedDate <= dates.EndDate &&
            o.Fulfilled == true &&
            o.Status.Contains("refunded") == false
        select o;

    return query.ToListAsync();
}

【讨论】:

  • 非常感谢,这解决了问题,我想我是在对它们进行分组,因为我认为这样过滤会更容易,但你的方法更有意义,再次感谢 :)跨度>
  • @DanMartz,更新了解决async问题的答案。
  • 嗨@Svyatoslav Danyliv 进一步解决这个问题,您知道查询中是否有办法将第一个订单中的 ReferralLink 添加到第一个订单具有 X ReferralLink 的日期范围内的订单?
  • @DanMartz,更新答案。
  • 谢谢!虽然我不确定我是否解释得足够好,但我的意思是最后你要返回 o,我需要对于在日期范围内没有推荐链接的订单,加入 first.referralLink有了那个记录,这可能吗?
猜你喜欢
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多