我一直在努力在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表的情况下制作一个呢?
答案 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();