2017-08-31 57 views
1

我一直在努力在我的LINQ表達式中使用Max函數。我想從多個SQL表中選擇去年(「最大」年)的各種屬性。紅色的波浪狀告訴我說我的int?不包含Max和Enumerable.Max(我想要的函數)的定義需要接收器類型的IEnumerable < int>。我對所有這些東西都是全新的,當我搜索網絡時,我無法想出解釋我需要做什麼來解決這個問題的明確解釋。我想它是一個SQL表,它會像普通的SQL查詢那樣遍歷行。最大函數Linq查詢 - 可空的Int不是IEnumerable?

我的代碼,我已經嘗試了許多變化:

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 < int>所以我怎樣才能讓它成爲一個不妨礙我的SQL表?

+0

'Nullable'是不是'Collection',它只是一個可以賦值的_value類型ed null_。對於單個值的「Max」沒有意義,所以在那裏沒有'Max()'函數。 – Sach

回答

1

這應該給予最大的Survey收集/表ReportingYear值:

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

雖然我確信有一百萬種方法可以做到,但作爲初學者,您的解決方案對我來說很有意義。謝謝! – Stuff

1

Nullable,顧名思義,表示可以分配空值的值類型。這意味着該物業擁有一個單一的價值,而不是Collection

從您的代碼看來,您希望獲得存儲在ReportingYear中的一組年份的最大值,因此您應該將ReportingYear定義爲某種集合,如List<int>

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

如果是可爲空是很重要的,創建可空整數的名單,具體如下:

public List<int?> NullableReportingYear { get; set; } 
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)