C# Apache Ignite组的Linq查询问题

C# Apache Ignite组的Linq查询问题,c#,linq,ignite,C#,Linq,Ignite,我正在尝试连接三个缓存,其中两个保持外部连接,还有GROUPBY子句。在下面的查询中,我遇到了一个奇怪的问题,生成的sql不正确 var query=(来自serviceCache中的服务 在service.Value.ServiceId上的meetingServiceCache.DefaultIfEmpty()中加入meetingService等于meetingService.Value.ServiceId 在meetingCache中加入会议。meetingService.Value.Mee

我正在尝试连接三个缓存,其中两个保持外部连接,还有GROUPBY子句。在下面的查询中,我遇到了一个奇怪的问题,生成的sql不正确

var query=(来自serviceCache中的服务
在service.Value.ServiceId上的meetingServiceCache.DefaultIfEmpty()中加入meetingService等于meetingService.Value.ServiceId
在meetingCache中加入会议。meetingService.Value.MeetingId上的DefaultIfEmpty()等于meeting.Value.MeetingId
按service.Value.ServiceId将新的{service,meeting}分组到g中
选择新的{
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转换有问题


如果我做错了,请告诉我。此外,代码段是在没有intellisense的情况下手动键入的,请原谅我的输入错误。

分组后,您只能选择
属性或聚合函数。另外,左连接应该以不同的方式编写

var查询=
来自serviceCache中的服务
在service.Value.ServiceId上的meetingServiceCache中加入meetingService等于meetingService.Value.ServiceId到j中
来自j.DefaultIfEmpty()中的meetingService
在meetingService.Value.MeetingId等于meeting.Value.MeetingId的meetingCache中加入meeting
来自在j.DefaultIfEmpty()中的会议
按service.Value.ServiceId将新的{service,meeting}分组到g中
选择新的
{
ServiceId=g.密钥,
lastMeeting=g.Max(x=>x.meeting.Value.CreatedDate)
};

分组后,您只能选择
属性或聚合函数。另外,左连接应该以不同的方式编写

var查询=
来自serviceCache中的服务
在service.Value.ServiceId上的meetingServiceCache中加入meetingService等于meetingService.Value.ServiceId到j中
来自j.DefaultIfEmpty()中的meetingService
在meetingService.Value.MeetingId等于meeting.Value.MeetingId的meetingCache中加入meeting
来自在j.DefaultIfEmpty()中的会议
按service.Value.ServiceId将新的{service,meeting}分组到g中
选择新的
{
ServiceId=g.密钥,
lastMeeting=g.Max(x=>x.meeting.Value.CreatedDate)
};

这似乎是Ignite中的一个bug,我已经提交了一份文件

解决方法是对连接的表重新排序,并将
会议
放在第一位,如下所示:

var query = (from meeting in meetingCache
            join meetingService in meetingServiceCache.DefaultIfEmpty() on meeting.Value.MeetingId equals meetingService.Value.MeetingId
            join service in serviceCache service.Value.ServiceId equals meetingService.Value.ServiceId
            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;

另一个解决方法是使用原始SQL进行此查询。

这似乎是Ignite中的一个bug,我已经提交了一个文件

解决方法是对连接的表重新排序,并将
会议
放在第一位,如下所示:

var query = (from meeting in meetingCache
            join meetingService in meetingServiceCache.DefaultIfEmpty() on meeting.Value.MeetingId equals meetingService.Value.MeetingId
            join service in serviceCache service.Value.ServiceId equals meetingService.Value.ServiceId
            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;

另一个解决方法是使用原始SQL进行此查询。

我刚刚验证,它仍然不起作用。Apache ignite linq转换与传统的linq到SQL有点不同。通过以上更改,生成的sql只是从sql中省略了meetingService和会议缓存。也许是时候揭开您使用过的库了?将您添加到
.ToCacheQueryable().GetFieldsQuery.Sql如果需要的话,可以自己翻译。我刚刚验证过,它仍然不起作用。Apache ignite linq翻译与传统的linq到sql有点不同。通过以上更改,生成的sql只是从sql中省略了meetingService和会议缓存。也许是时候揭开您使用过的库了?将您添加到
.ToCacheQueryable().GetFieldsQuery.Sql我想知道为什么SQL中有
min
,而QueryLook中有
Max
,这对我来说就像一个bug。你能提供更多的细节吗?理想情况下,是一个最小的复制程序。@PavelTupitsyn,通过放入CacheLinqTest.Functions.cs文件,尝试运行下面的代码,并检查生成的查询this 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).选择(g=>new{Org=g.Key,AgeSum=g.Max(x=>x.p.Value.Age)})@帕维特皮琴。将以下代码放入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)。选择(g=>new Org=g.Key,AgeSum=g.Max(x=>x.p.Value.Age)}).Sql;
@tech2avinash这似乎适合我,Sql看起来是正确的,查询返回结果。我想知道为什么Sql中有
min
,而queryLooks中有
Max
,这对我来说像是一个bug。你能提供更多细节吗?理想情况下,是一个最小的复制器。@PavelTupitsyn,通过放入CacheLinqTest.Functions尝试运行下面的代码.cs文件,并检查生成的查询this 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)。选择(g=>new{Org=g.Key,AgeSum=g.Max(x=>x.p.Value.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{,o}).GroupBy(x=>x.o.Value.Name)。选择(g=>new{Org=g.Key,AgeSum=g.Max(x=>x.p.Value.Age)})