gpt4 book ai didi

c# - 通过语句加速 linq 组

转载 作者:行者123 更新时间:2023-11-30 16:09:02 27 4
gpt4 key购买 nike

我有一张这样的 table

UserID   Year   EffectiveDate   Type    SpecialExpiryDate
1 2015 7/1/2014 A
1 2016 7/1/2015 B 10/1/2015

表中没有ExpriyDate,因为它的有效期只有一年,所以有效期可以从生效日期算起加上一年。

我要得到的结果是这样的(当年生效日期和下一年到期日期)

UserID   EffectiveDate   ExpiryDate
1 7/1/2014 7/1/2016

而如果用户的类型是B,那么就会有一个特殊的到期日,那么对于这个人来说,结果就是

UserID   EffectiveDate   ExpiryDate
1 7/1/2014 10/1/2015

这是我写的代码

var result = db.Table1
.Where(x => x.Year>= 2015 && (x.Type == "A" || x.Type == "B"))
.GroupBy(y => y.UserID)
.OrderByDescending(x => x.FirstOrDefault().Year)
.Select(t => new
{
ID = t.Key,
Type = t.FirstOrDefault().Type,
EffectiveDate = t.FirstOrDefault().EffectiveDate,
ExpiryDate = t.FirstOrDefault().SpecialExpiryDate != null ? t.FirstOrDefault().SpecialExpiryDate : (t.Count() >= 2 ? NextExpiryDate : CurrentExpiryDate)
}
);

代码可以得到我需要的结果,但问题是结果集中大约有10000条记录,耗时大约5到6秒。该项目用于网络搜索 API,所以我想加快速度,有没有更好的查询方式?

编辑

对不起我弄错了,在select子句中应该是

EffectiveDate = t.LastOrDefault().EffectiveDate

但是在C#的Linq中,不支持将这个LastOrDefault函数传递给sql,又引发了新的问题,如何最简单的获取组的第二项?

最佳答案

您可以使用数据库中的 View 即时生成计算数据。

像这样的东西(伪代码):

Create View vwUsers AS 
Select
UserID,
Year,
EffectiveDate,
EffectiveData + 1 as ExpiryDate, // <--
Type,
SpecialExpiryDate
From
tblUsers

只需将您的 LINQ 查询连接到它即可。

关于c# - 通过语句加速 linq 组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28223377/

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