2016-11-08 94 views
1

我有用於跟蹤工作組的ASP.NET核心應用程序。 WorkCrewMembers是包含船員的班級。它有一個鍵爲WorkCrew的班級,其中有一個TimeSpan?字段的某個笨拙列表,指定該班組在何時開始工作在一週的特定幾天:SunStart, MonStart, TueStart, WedStart, ThuStart, FriStart, SatStart。這些類是從舊數據庫生成的。我有以下的代碼是在ASP.NET核心愉快工作1.0.1升級到.NET Core 1.1後,LINQ語句崩潰了預覽版1

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     using (DBContext context = new DBContext()) { 
      var lstWorkCrew = (from m in context.WorkCrewMembers 
       where m.WorkCrew.TodayStartTime() != null 
       select m.WorkCrewId).ToList(); 
      Console.WriteLine($"Today {lstWorkCrew.Count} work crews"); 
     } 
    } 
} 

public partial class WorkCrew { 
    public TimeSpan? TodayStartTime() { 
     TimeSpan?[] starts = { 
      SunStart, MonStart, TueStart, WedStart, ThuStart, FriStart, SatStart 
     }; 
     int dayOfWeek = (int)DateTime.Now.DayOfWeek; 
     return starts[dayOfWeek]; 
    } 
} 

然而,當我升級包1.1,我與m.WorkCrew.TodayStartTime()湊了線以下錯誤:

未處理的異常信息:System.ArgumentException:方法System.Nullable`1 [System.TimeSpan] TodayStartTime()'宣佈類型 'WorkCrew' 不能與類型 'System.Int32'

有趣的實例調用如果我這樣做from w in context.WorkCrew where w.TodayStartTime() != null select w它工作正常。

這是1.1中的突破性變化嗎?或者這是應該提前引發異常,因爲我的代碼不合法​​?或者只是微軟將修復的錯誤?

回答

1

在LINQ符號中看起來確實是SelectWhere的順序顛倒了,你得到了第一個返回給你的Id。這就解釋了爲什麼如果你選擇了項目本身而不是Id,它會起作用。

我想,如果你把它改爲

context.WorkCrewMembers 
     .Where(m => m.WorkCrew.TodayStartTime() != null) 
     .Select(m => m.WorkCrewId) 
     .ToList(); 

它將正常工作。

我個人比較喜歡這個符號:)

+0

唉!得到完全相同的錯誤:(似乎由於某種原因'm.WorkCrew'現在是空的!如果我第一次得到'var wcm = context.WorkCrewMembers.ToList()',然後有'wcm.Where(m => m.WorkCrew?.TodayStartTime())' - 我沒有得到異常,但是我得到0行,就好像* all *'m.WorkCrew'爲null – Felix

+0

對不起,這看起來像是一個錯誤,我可以看看這個簡單的代碼片段是如何產生這種類型的錯誤的,在這裏我們不應該編譯以防萬一有什麼錯誤,我想你不會在你的類的某個地方進行一些隱藏的反射調用, –

+0

謝謝。沒有 - 在這裏沒有隱藏的魔法:) – Felix

0

溶液變成了令人驚訝的簡單: 而不是where m.WorkCrew.TodayStartTime() != null在ASP.NET 1.1的核心,你應該使用where m.WorkCrew.TodayStartTime != null