最大函数Linq查询 - Nullable Int不是IEnumerable?

时间:2017-08-31 16:44:28

标签: c# sql .net asp.net-mvc linq

我一直在努力在LINQ表达式中使用Max函数。我想从去年(“最大”年份)的多个SQL表中选择各种属性。红色的波浪形告诉我,我的int?不包含Max和Enumerable.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())

当我查看ReportingYear属性的定义时,它看起来像这样:

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

我很确定问题是它不是IEnumerable&lt; INT&GT;那么如何在不弄乱我的SQL表的情况下制作一个呢?

3 个答案:

答案 0 :(得分:1)

Nullable,根据定义,表示可以指定为null的值类型。这意味着该属性包含单个值,而不是Collection

从您的代码中看起来您希望获得存储在ReportingYear中的一组年份的最大值,因此您应该将ReportingYear定义为某种类型的集合,例如{{1} }。

List<int>

如果可以为空是很重要的,请创建一个可空整数列表,如下所示:

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

答案 1 :(得分:1)

在添加以下内容之前,请使用 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)

答案 2 :(得分:1)

这应该在ReportingYear集合/表中提供最大Survey值:

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