Linq EF group by将最新条目输入对象列表

时间:2016-08-11 16:18:12

标签: c# sql-server entity-framework linq

我正试图从简单的SQL转向EF。

但是有一些复杂的查询(连接)似乎很难生成linq for。

起初我尝试使用sqltolinq工具生成linq,但它会出错,因为查询中不支持某些内容。

这是linq:

var entryPoint = (from ep in dbContext.tbl_EntryPoint
                 join e in dbContext.tbl_Entry on ep.EID equals e.EID
                 join t in dbContext.tbl_Title on e.TID equals t.TID
                 where e.OwnerID == user.UID
                 select new {
                     UID = e.OwnerID,
                     TID = e.TID,
                     Title = t.Title,
                     EID = e.EID
                 });

表条目有许多条目,我想分组并获取每组的最新信息。但后来我需要选择一个视图模型对象,它将绑定到gridview。

我不知道在哪里可以实现逻辑分组并从每个逻辑中获取最新信息,并且能够从连接表中获取值到viewModel对象。

某处我需要添加

group entry by new
                    {
                        entry.aID,
                        entry.bCode,
                        entry.Date,
                        entry.FCode
                    }
                    into groups
select groups.OrderByDescending(p => p.ID).First()

在上面的linq中从每个组中检索最新的。

1 个答案:

答案 0 :(得分:2)

您可以在加入后立即插入group by

var query = 
    from ep in dbContext.tbl_EntryPoint
    join e in dbContext.tbl_Entry on ep.EID equals e.EID
    join t in dbContext.tbl_Title on e.TID equals t.TID
    where e.OwnerID == user.UID
    group new { ep, e, t } by new { e.aID, e.bCode, e.Date, e.FCode } into g
    let r = g.OrderByDescending(x => x.e.ID).FirstOrDefault()
    select new
    {
        UID = r.e.OwnerID,
        TID = r.e.TID,
        Title = r.t.Title,
        EID = r.e.EID
    };

这里的诀窍是在groupby之间分组后包含您需要的内容。

但是,上述内容将被翻译为CROSS APPLY,并且所有联接都包含两次。如果分组键仅包含一个表中的字段,则最好先执行分组/选择最后一个分组元素,然后将结果与其余分组结合:

var query = 
    from e in (from e in dbContext.tbl_Entry
               where e.OwnerID == user.UID
               group e by new { e.aID, e.bCode, e.Date, e.FCode } into g
               select g.OrderByDescending(e => e.ID).FirstOrDefault())
    join ep in dbContext.tbl_EntryPoint on e.EID equals ep.EID
    join t in dbContext.tbl_Title on e.TID equals t.TID
    select new
    {
        UID = e.OwnerID,
        TID = e.TID,
        Title = t.Title,
        EID = e.EID
    };