gpt4 book ai didi

C# LINQ 查询 (MYSQL EF) - 不同的最新记录

转载 作者:可可西里 更新时间:2023-11-01 07:02:58 24 4
gpt4 key购买 nike

我有一个表,我们称它为 Record。包含:ID(整数) |客户 ID(整数) |时间(日期时间) |数据(可变字符)

我需要每个客户的最新(最新)记录:

SQL

select * from record as i group by i.custid having max(id);

LINQ 版本 1

dgvLatestDistinctRec.DataSource = from g in ee.Records
group g by g.CustID into grp
select grp.LastOrDefault();

这会引发错误:

System.NotSupportedException was unhandled by user code Message=LINQ to Entities does not recognize the method 'Faizan_Kazi_Utils.Record LastOrDefault[Record ](System.Collections.Generic.IEnumerable`1[Faizan_Kazi_Utils.Record ])' method, and this method cannot be translated into a store expression. Source=System.Data.Entity

LINQ 版本 2

var list = (from g in ee.Records
group g by g.CustID into grp
select grp).ToList();
Record[] list2 = (from grp in list
select grp.LastOrDefault()).ToArray();
dgvLatestDistinctRec.DataSource = list2;

这可行,但效率低下,因为它将所有记录从数据库加载到内存中,然后仅提取每个组的最后一个(最近的成员)。

是否有任何 LINQ 解决方案可以达到上述 SQL 解决方案的效率和可读性?

最佳答案

更新:

var results = (from rec in Record group rec by rec.CustID into grp 
select new
{
CustID = grp.Key,
ID = grp.OrderByDescending(r => r.ID).Select(x => x.ID).FirstOrDefault(),
Data = grp.OrderByDescending(r => r.ID).Select(x => x.Data).FirstOrDefault()
}
);

所以我制作了一个测试表并编写了一个 Linq -> SQL 查询,它将完全满足您的需要。看看这个,让我知道你的想法。唯一要记住的是,如果这个查询被缩放,我相信它会在选择新的分组之后为每个 CustID 记录运行对数据库的查询。唯一可以确定的方法是在您运行此处的信息查询时运行 SQL Tracer .. http://www.foliotek.com/devblog/tuning-sql-server-for-programmers/

原文:

你能做这样的事情吗? from g in ee.Records where g.CustID == (from x in ee.Records where (g.CustID == x.CustID) && (g.ID == x.Max(ID)).选择( r => r.CustID))

以上都是伪代码,但希望您能理解。

关于C# LINQ 查询 (MYSQL EF) - 不同的最新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7235643/

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