linq max 在 lambda 中也带有“and”条件的 “where” 子句中

本文关键字:and 条件 子句 where max lambda linq | 更新日期: 2023-09-27 17:56:56

我需要获取一个具有这些条件的字段,我在SQL中的实际代码是这样的:

SELECT archivo, fechadiario 
FROM ri_diariodefotos 
WHERE idproyecto=@projectId
AND fechadiario = (SELECT MAX(fechadiario) 
                   FROM ri_diariodefotos 
                   WHERE idproyecto=@projectId)

我实际上有这个:

RI_DiariodeFotos.Where(a=> a.Idproyecto == PROJECTID && a.Fechadiario == 
    RI_DiariodeFotos
        .Where(x=> x.Idproyecto == PROJECTID)
        .OrderByDescending(x=> x.Fechadiario)
        .Select(x=> x.Fechadiario)
        .FirstOrDefault())
        .Select(w=> w.Archivo).ToList().First()

它实际上有效,但是当我尝试时,我收到此错误

LINQ to 实体无法识别该方法 'System.Collections.Generic.List'1[System.String] ToListString' 方法,并且此方法无法转换为存储表达式。

linq max 在 lambda 中也带有“and”条件的 “where” 子句中

如果我很了解你,你想为每个项目获得Max(of Fechadiario)。因此,您需要按projectid对数据进行分组:

var result = RI_DiariodeFotos
    .Where(x=> x.Idproyecto==PROJECTID)
    .GroupBy(x=> x.Idproyecto)
    .Select(g=>new
        {
            ProjectId = g.Key,
            Fechadiario = g.Max(f=>f.Fechadiario)
        });

注意:

若要将其与 EF 一起使用,必须按如下方式声明类:

public class ProjectStatistic
{
   public int ProjectId {get;set;}
   public int Fechadiario {get;set;}
}

然后,您必须通过在语句中的关键字后面添加ProjectStatistic new将查询结果"抓取"到Enumerable<ProjectStatistic> Select