【发布时间】: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 实体是否聪明