【发布时间】:2016-04-22 06:26:17
【问题描述】:
我有一个庞大的项目列表,需要按一个属性对它们进行分组。然后应该选择每个组中最老的。
简化示例:选择每个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();
}
班级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; }
}
我想知道为什么这条语句花了这么长时间直到我在Result 设置断点并查看生成的 SQL 语句:
{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`}
问题:有没有办法解决他的效率更高?子选择很昂贵,EF 每列生成一个。我使用 mySQL .NET 连接器版本 6.9.5.0
【问题讨论】:
-
由于某种原因无法重现,对我来说,这一切都在一个查询中完成
-
@AlexanderDerck 您在使用 mySQL 吗?我使用 .NET 连接器版本 6.9.5.0
-
另一个框架增加复杂性的案例?
标签: c# mysql entity-framework linq