简体   繁体   English

如何在Entity Framework Core中创建group子句

[英]How to create group clause in Entity Framework Core

I am trying to query 2 tables, Club and LinkClubUser . 我正在尝试查询2表, ClubLinkClubUser I want to retrieve the last club that a User is assigned from the last Date in the LinkclubUser. 我想从LinkclubUser中的最后一个日期检索分配给用户的最后一个俱乐部。

I have the right SQL query: 我有正确的SQL查询:

select top 1 
    max(A.DataInscricao), 
    A.Nome, A.NomeNaCamisola, A.NumNaCamisola, A.Posicao, A.Situacao  
from 
    Clube as A 
inner join 
    LinkClubeUser as B on a.Id = b.IdClube
where 
    b.IdUser ='9faea9f3-28d7-4e34-8572-3102726d3c75'
group by 
    A.Nome, A.NomeNaCamisola, A.NumNaCamisola, A.Posicao, A.Situacao

I got the right row. 我得到了正确的行。

I try to convert this query to Entity Framework Core like this, but I get back more than 1 row: 我试图像这样将查询转换为Entity Framework Core,但返回了1行以上:

var query = _dbContext
                .LinkClubeUser
                .Join(_dbContext.Clube,
                    lnk => lnk.IdClube,
                    clube => clube.Id,
                    (Lnk, clube) => new { Lnk, clube })
                .Where(t => t.Lnk.IdUser == "9faea9f3-28d7-4e34-8572-3102726d3c75")
                .GroupBy(t => new
                {
                    t.clube.Id,
                    t.clube.Nome,
                    t.clube.NomeNaCamisola,
                    t.clube.NumNaCamisola,
                    t.clube.Posicao,
                    t.clube.Situacao,
                    t.clube.DataInscricao
                }, t => t.clube)
                .Select(g => new
                {
                    Nome = g.Key.Nome,
                    NomeNaCamisola = g.Key.NomeNaCamisola,
                    NumNaCamisola = g.Key.NumNaCamisola,
                    Posicao = g.Key.Posicao,
                    Situacao = g.Key.Situacao,
                    DataInscricao = (DateTime)g.Max(p => p.DataInscricao)
                }).Take(1);

but this code is converted by Entity Framework Core like this 但是此代码是由Entity Framework Core像这样转换的

SELECT 
    [lnk].[Id], [lnk].[Date], [lnk].[IdClub],
    [lnk].[IdQuestionario], [lnk].[IdUser], [clube].[Id],
    [clube].[ClubActual], [clube].[Date], [clube].[Nome],
    [clube].[NomeNaCamisola], [clube].[NumNaCamisola], [clube].[Posicao],
    [clube].[Situacao]
FROM 
    [LinkClubeUser] AS [lnk] 
INNER JOIN 
    [Clube] AS [clube] ON [lnk].[IdClube] = [clube].[Id]
WHERE 
    [lnk].[IdUser] = N'9faea9f3-28d7-4e34-8572-3102726d3c75' 
ORDER BY 
    [clube].[Id], [clube].[Nome], [clube].[NomeNaCamisola],
    [clube].[NumNaCamisola], [clube].[Posicao], [clube].[Situacao],
    [clube].[DataInscricao]

I don't see the group by clause. 我没有看到group by子句。

What's wrong in my Entity Framework Core query? 我的Entity Framework Core查询出了什么问题?

I don´t have the group clause. 我没有group子句。

I think you added all the clube table fields to your group clause so your group clause lost its nature and did not compile to SQL, while you added some of them in your first SQL query. 我认为您将所有clube表字段都添加到了group子句中,因此当您在第一个SQL查询中添加了其中一些时,您的group子句便失去了其本质,无法编译为SQL。

Edit 编辑

var query = (from user in _dbContext.LinkClubeUser
             Join club in _dbContext.Clube on user.IdClub equals club.Id into cu
             let clubUser = cu.DefaultIfEmpty() // outer join if you need it
                Where clubUser.IdUser == "9faea9f3-28d7-4e34-8572-3102726d3c75")
                Select  new
                {
                    Nome = user.Nome,
                    NomeNaCamisola = user.NomeNaCamisola,
                    NumNaCamisola = user.NumNaCamisola,
                    Posicao = user.Posicao,
                    Situacao = user.Situacao,
                    DataInscricao = (DateTime)clubUser.Max(p => p.DataInscricao)
                }).Take(1);

Hope it helps. 希望能帮助到你。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM