Ho una lista enorme di articoli e ho bisogno di raggrupparli per una proprietà. Quindi dovrebbe essere selezionato il più vecchio di ogni gruppo.Entity Framework GroupPer prendere il più vecchio con mySQL
Esempio semplificato: selezionare l'utente più vecchio di ogni FirstName
.
using (ED.NWEntities ctx = new ED.NWEntities())
{
IQueryable<ED.User> Result = ctx.User.GroupBy(x => x.FirstName)
.Select(y => y.OrderBy(z => z.BirthDate)
.FirstOrDefault())
.AsQueryable();
}
Classe User
:
public partial class User
{
public int UserID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public Nullable<System.DateTime> BirthDate { get; set; }
}
Mi chiedevo perché questa dichiarazione ha preso così a lungo fino a quando ho impostato un punto di interruzione Result
e guardai in istruzione SQL generata:
{SELECT
`Apply1`.`UserID`,
`Apply1`.`FIRSTNAME1` AS `FirstName`,
`Apply1`.`LastName`,
`Apply1`.`BirthDate`
FROM (SELECT
`Distinct1`.`FirstName`,
(SELECT
`Project2`.`UserID`
FROM `User` AS `Project2`
WHERE (`Distinct1`.`FirstName` = `Project2`.`FirstName`) OR ((`Distinct1`.`FirstName` IS NULL) AND (`Project2`.`FirstName` IS NULL))
ORDER BY
`Project2`.`BirthDate` ASC LIMIT 1) AS `UserID`,
(SELECT
`Project2`.`FirstName`
FROM `User` AS `Project2`
WHERE (`Distinct1`.`FirstName` = `Project2`.`FirstName`) OR ((`Distinct1`.`FirstName` IS NULL) AND (`Project2`.`FirstName` IS NULL))
ORDER BY
`Project2`.`BirthDate` ASC LIMIT 1) AS `FIRSTNAME1`,
(SELECT
`Project2`.`LastName`
FROM `User` AS `Project2`
WHERE (`Distinct1`.`FirstName` = `Project2`.`FirstName`) OR ((`Distinct1`.`FirstName` IS NULL) AND (`Project2`.`FirstName` IS NULL))
ORDER BY
`Project2`.`BirthDate` ASC LIMIT 1) AS `LastName`,
(SELECT
`Project2`.`BirthDate`
FROM `User` AS `Project2`
WHERE (`Distinct1`.`FirstName` = `Project2`.`FirstName`) OR ((`Distinct1`.`FirstName` IS NULL) AND (`Project2`.`FirstName` IS NULL))
ORDER BY
`Project2`.`BirthDate` ASC LIMIT 1) AS `BirthDate`
FROM (SELECT DISTINCT
`Extent1`.`FirstName`
FROM `User` AS `Extent1`) AS `Distinct1`) AS `Apply1`}
Domanda: C'è un modo per risolvere il suo più efficiente? I sottoselezionamenti sono costosi e EF ne genera uno per colonna. Uso mySQL .NET Connector versione 6.9.5.0
Non può riprodurre questo per qualche motivo, per me è tutto fatto in una query –
@AlexanderDerck stai usando MySQL? Utilizzo .NET Connector versione 6.9.5.0 – fubo