C#LINQ查询(MYSQL EF) - 独特和最新记录

Fai*_*azi 5 c# mysql linq distinct entity-framework-4

我有一张桌子,我们称之为Record.包含:ID(int)| CustID(int)| 时间(日期时间)| 数据(varchar)

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

SQL

select * from record as i group by i.custid having max(id);
Run Code Online (Sandbox Code Playgroud)

LINQ版本1

dgvLatestDistinctRec.DataSource = from g in ee.Records
                                  group g by g.CustID into grp
                                  select grp.LastOrDefault();
Run Code Online (Sandbox Code Playgroud)

这会引发错误:

System.NotSupportedException未被用户代码处理Message = LINQ to Entities无法识别方法'Faizan_Kazi_Utils.Record LastOrDefault [Record](System.Collections.Generic.IEnumerable`1 [Faizan_Kazi_Utils.Record])'方法,而且此方法不能翻译成商店表达.来源= 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;
Run Code Online (Sandbox Code Playgroud)

这是有效的,但效率很低,因为它将数据库中的所有记录加载到内存中,然后只提取每个组的最后一个(最近的成员).

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

big*_*mil 4

更新:

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()
    }
);
Run Code Online (Sandbox Code Playgroud)

因此,我制作了一个测试表并编写了一个 Linq -> SQL 查询,它将完全满足您的需要。看看这个,让我知道你的想法。唯一要记住的是,如果此查询是缩放的,我相信它将在 select new 中分组后对每个 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)).Select(r => r.CustID))

这些都是伪代码,但希望您能明白。