升级到.net Core 1.1 Preview 1后LINQ语句中断

本文关键字:LINQ 语句 中断 Preview net Core | 更新日期: 2023-09-27 18:16:57

我有ASP。. NET Core应用程序,用于跟踪工作人员。WorkCrewMembers是包含船员的类。它有一个进入WorkCrew类的键,它有一个有点笨拙的TimeSpan?字段列表,指定该船员在一周的特定日期开始工作:SunStart, MonStart, TueStart, WedStart, ThuStart, FriStart, SatStart。这些类是从遗留数据库生成的。我有以下的代码,是愉快地在ASP工作。Core 1.0.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()行中得到以下错误:

Unhandled Exception: System。参数异常:方法'System. nullable ' 1TodayStartTime()'不能被'System '类型的实例调用。Int32 '

有趣的是,如果我做from w in context.WorkCrew where w.TodayStartTime() != null select w它工作得很好。

这是一个突破性的变化在1.1?还是因为我的代码不合法,应该更早抛出异常?或者只是微软将修复的一个bug ?

升级到.net Core 1.1 Preview 1后LINQ语句中断

看起来SelectWhere的顺序在这种LINQ符号中是颠倒的,并且您首先获得返回Id的选择。这就解释了为什么当你选择项目本身而不是Id时它会起作用。

我想如果你把它改成

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

它将正常工作。

我个人更喜欢这个符号:)

解决方案非常简单:代替ASP中的where m.WorkCrew.TodayStartTime() != null。. NET Core 1.1你应该使用where m.WorkCrew.TodayStartTime != null