升级到.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 ?
看起来Select
和Where
的顺序在这种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