繁体   English   中英

Linq EF分组依据以获取最新条目到对象列表中

[英]Linq EF group by to get latest entries into list of objects

我正在尝试从简单的SQL迁移到EF。

但是,有些复杂的查询(联接)似乎很难为其生成linq。

最初,我尝试使用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中检索每个组的最新信息。

您可以在联接之后立即插入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之间进行分组之后包括您需要by

但是,以上内容将转换为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
    };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM