gpt4 book ai didi

c# - Entity Framework GroupBy 使用 mySQL 取最老的

转载 作者:可可西里 更新时间:2023-11-01 06:30:16 24 4
gpt4 key购买 nike

我有一个巨大的项目列表,需要按一个属性对它们进行分组。然后应选择每个组中年龄最大的。

简化示例:选择每个 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();
}

用户:

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

最佳答案

使用 Jon Skeet 的 answer在不同的..

public static IEnumerable<TSource> DistinctBy<TSource, TKey>
(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
HashSet<TKey> seenKeys = new HashSet<TKey>();
foreach (TSource element in source)
{
if (seenKeys.Add(keySelector(element)))
{
yield return element;
}
}
}

你可以试试:

using (ED.NWEntities ctx = new ED.NWEntities())
{
IQueryable<ED.User> Result = ctx.User.OrderBy(y => y.BirthDate)
.DistinctBy(z => z.FirstName)
.AsQueryable();
}

关于c# - Entity Framework GroupBy 使用 mySQL 取最老的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36786443/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com