Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq EF group by以获取对象列表中的最新条目_C#_Sql Server_Entity Framework_Linq - Fatal编程技术网

C# Linq EF group by以获取对象列表中的最新条目

C# Linq EF group by以获取对象列表中的最新条目,c#,sql-server,entity-framework,linq,C#,Sql Server,Entity Framework,Linq,我正在尝试从简单的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

我正在尝试从简单的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中,您可以从每个组中检索最新的组。

您可以在联接后立即插入
groupby

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
    };
这里的诀窍是在
group
by
之间分组后包含所需内容

但是,上述内容将被转换为
交叉应用
,包括两次所有连接。如果分组键仅包含一个表中的字段,则最好先执行分组/选择最后一个分组元素,然后将结果与其余元素联接:

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
    };

非常感谢。你是明星@Ivan。。这很好用。不过,这只是另一个简单的问题。如果要在中添加逻辑,请选择新属性,例如UID=e.ownerID+RanddomNumber()。我猜这在这里是不允许的,因为查询是针对数据库运行的。但是实现这一点最有效的方法是什么呢?你是对的-EF不支持无法转换为SQL的函数。但是您可以总是说
query.AsEnumerable().Select(e=>new{…})
并在new
Select
中放入您喜欢的内容,因为其余内容将在LINQ to Objects上下文中执行,其中支持编译的所有内容。