【问题标题】:Left outer join off of group by dataset using linq使用 linq 按数据集分组的左外连接
【发布时间】:2015-03-30 17:01:33
【问题描述】:

我正在尝试将以下 SQL 编写为 linq 查询。

SELECT grp.OrganisationId,
       grp.OrderCount,
       organisations.Name
FROM   (select OrganisationId,
               count(*) as OrderCount
        from orders
        where 1 = 1
        group by OrganisationId) grp
LEFT OUTER JOIN organisations on grp.OrganisationId = organisations.OrganisationId
WHERE 1 = 1

为了示例的方便,简化了 where 子句。

我需要在不使用导航属性的情况下执行此操作。

这是我的尝试:

var organisationQuery = ClientDBContext.Organisations.Where(x => true);

var orderGrouped = from order in ClientDBContext.Orders.Where(x => true)
group order by order.OrganisationId into grouping
select new { Id = grouping.Key.Value, OrderCount = grouping.Count() };

var orders = from og in orderGrouped
join org in organisationQuery on og.Id equals org.Id
select(x => new OrganisationOrdersReportPoco()
{
    OrganisationNameThenCode = org.Name,
    TotalOrders = og.OrderCount
});

但是我收到一个错误...

“加入”调用中的类型推断失败

从以前的帖子来看,我相信这是因为我“失去了按顺序加入”(但我不明白为什么在创建新的组织记录集时这很重要,计数)。

谢谢!

我知道您可能认为导航属性是这里的解决方案,但如果可能的话,请我们继续讨论以加入小组,因为这是我要解决的问题。

【问题讨论】:

  • 不想使用navigationproperties的原因是这两个实体之间没有直接的外键关系?
  • 不,有。订单拥有组织 ID……但它真的很慢。我只想要有订单的组织,而且我看不到按方法实施分组的方法(使用导航道具)(根据我的数据,这是迄今为止最有效的方法)。如果我执行“where .any()”或类似操作,则需要永远运行。
  • 这可能是因为您在处理数据之前提取数据,因为您有 3 个查询,我怀疑 linq 2 实体是否聪明

标签: c# linq


【解决方案1】:

您正在混合使用 lambdaLINQ 表达式。将选择更改为:

select new OrganisationOrdersReportPoco()
{
    OrganisationNameThenCode = org.Name,
    TotalOrders = og.OrderCount
};

【讨论】:

    【解决方案2】:

    如果我正确理解了你的模型,你可以试试这个:

    var orders = ClientDBContext.Organisations.Select(org => new OrganisationOrdersReportPoco
    {
        OrganisationNameThenCode = org.Name,
        TotalOrders = org.Orders.Count()
    }).ToList();
    

    【讨论】:

      猜你喜欢
      • 2010-11-30
      • 2010-10-16
      • 1970-01-01
      • 2017-11-21
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多