【发布时间】:2021-03-06 10:46:40
【问题描述】:
我正在尝试连接三个缓存,其中两个是左外连接的,还有 group by 子句。使用下面的查询我遇到了奇怪的问题,生成的 sql 不正确。
var query = (from service in serviceCache
join meetingService in meetingServiceCache.DefaultIfEmpty() on service.Value.ServiceId equals meetingService.Value.ServiceId
join meeting in meetingCache.DefaultIfEmpty() on meetingService.Value.MeetingId equals meeting.Value.MeetingId
group new { service, meeting } by service.Value.ServiceId into g
select new {
service.Value.ServiceId,
lastMeeting = g.Select(x=>x.meeting.Value.CreatedDate).Max()
}).ToCacheQueryable().GetFieldsQuery.Sql;
生成的查询如下所示
select _T0.SERVICEID,min(_T0.CreatedDate) from MEETINGSCHEMA.SERVICES as _T0
left outer join (select _T1.*,_T1.KEY,_T1.VAL from MEETINGSCHEMA.MEETINGSERVICE as _T1) as _T2 on (_T2.SERVICEID= _T0.SERVICEID)
left outer join (select _T3.*,_T3.KEY,_T3.VAL from MEETINGSCHEMA.MEETINGS as _T3) as _T4 on (_T4.MEETINGID= _T3.MEETINGID)
group by (_T0.SERVICEID)
在选定的列中,createdDate 应该从 _T4 引用中选择,但它总是从第一个表别名中选择,因此查询失败总是将 CreatedDate 报告为无效列。我怀疑 linq 到 sql 的转换有问题。
如果我做错了,请告诉我。此外,代码 sn-p 是手动输入的,没有智能感知,如果有错别字,请见谅。
【问题讨论】:
-
我想知道为什么你在 SQL 中有
min而在查询中有Max -
对我来说看起来像一个错误。你能提供更多细节吗?理想情况下,一个最小的复制器。
-
@PavelTupitsyn,尝试在 CacheLinqTest.Functions.cs 文件中运行下面的代码,并检查生成的查询 this people.Join(orgs.Where(o => o.Key > 10), p => p.Value.OrganizationId, o => o.Key, (p, o) => new { p, o }) .GroupBy(x => xoValue.Name) .Select(g => new { Org = g.Key, AgeSum = g.Max(x => xpValue.Age) });
-
@PavelTupitsyn。将下面的代码放在 Apache.Ignite.Core.Tests.Cache.Query.Linq>CacheLinqTest>TestGroupBy
var query = persons.Join(orgs.Where(o => o.Key > 10), p => p.Value.OrganizationId, o => o.Key, (p, o) => new { p, o }) .GroupBy(x => x.o.Value.Name) .Select(g => new { Org = g.Key, AgeSum = g.Max(x => x.p.Value.Age) }).ToCacheQueryable().GetFieldsQuery().Sql; -
@tech2avinash 这似乎对我有用,SQL 看起来正确并且查询返回结果。