2016-11-08 53 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