最大函数LINQ查询 - 无效的INT不可能



我一直在努力在我的linq表达式中使用最大函数。我想从去年的多个SQL表中选择各种属性("最大"一年)。红色弯腰告诉我我的int?不包含最大和枚举的定义。max(我想要的函数)需要接收器类型的iEnumerable<int>。我完全是所有这些东西的新手,当我搜索网络时,我无法清楚地说明我需要做的解决问题。我认为这是一个SQL表,它将像普通SQL查询一样穿过行。

我的代码,我尝试了许多变体:

var otherPrograms = (from hm in db.HabitatManagement
                     join svy in db.Survey on hm.SurveyID equals svy.SurveyID
                     join iu in db.InventoryUsers on hm.UserID equals iu.UserID
                     join pt in db.ProgramType on hm.ProgramTypeID equals pt.ProgramTypeID
                     where pt.Program != "State Agency Public Land Programs" 
                     && pt.Program != "State Agency Private Land Programs" 
                     && svy.ReportingYear.Max() 
                     select new
                      {
                          iu.StateID,
                          hm.ProgramTypeID,
                          pt.Program,
                          svy.ReportingYear
                      })
                       .Distinct()
                       .Select(x => new { x.StateID, x.Program, x.ProgramTypeID, x.ReportingYear, DisplayText = x.ReportingYear.ToString() + ", " + x.StateID.ToString() + ", " + x.Program.ToString() })
                       .OrderBy(x => x.StateID);

我还尝试了一个嵌套查询来实现同一件事(不确定我什至正确地做到了):

&& svy.ReportingYear = (from svy in db.Survey
                     select svy.ReportingYear.Max())

当我查看报告年属性的定义时,它看起来像:

public Nullable<int> ReportingYear {get; set;}

我很确定问题是它不是一个ienumerable&lt;int>那么,如何在不弄乱我的SQL表的情况下将其制成?

这应该在Survey集合/表中给出最大ReportingYear值:

int max = (from svy in db.Survey
                               where svy.ReportingYear.HasValue
                               select svy.ReportingYear.Value).Max();

Nullable,根据定义,表示可以分配的值类型。意思是该属性拥有一个值,而不是Collection

从您的代码中,您似乎想获得ReportingYear中存储的一组年的最大值,因此您可能应该将ReportingYear定义为某种集合,例如List<int>

public List<int> ReportingYear { get; set; }

,如果不可用很重要,请创建无效整数列表,如下:

public List<int?> NullableReportingYear { get; set; }

在其中添加以下内容之前,然后使用 maxyear 而不是您的svy.reportingyear.max()

let maxYear = (from svy in db.Survey
                    where svy.MaxYear != null
                    select (int)svy.MaxYear).Max()

所以...

&& svy.ReportingYear.Max() 

需要更改为

&& svy.ReportingYear != null && svy.ReportingYear == maxYear

&& (svy.ReportingYear == null || svy.ReportingYear == maxYear)

最新更新