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解决方案的效率和可读性?
更新:
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))
这些都是伪代码,但希望您能明白。
| 归档时间: |
|
| 查看次数: |
3896 次 |
| 最近记录: |