升级到.NET Core 1.1后,LINQ语句崩溃了预览版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中的突破性变化吗?或者这是应该提前引发异常,因为我的代码不合法?或者只是微软将修复的错误?
在LINQ符号中看起来确实是Select
和Where
的顺序颠倒了,你得到了第一个返回给你的Id。这就解释了为什么如果你选择了项目本身而不是Id,它会起作用。
我想,如果你把它改为
context.WorkCrewMembers
.Where(m => m.WorkCrew.TodayStartTime() != null)
.Select(m => m.WorkCrewId)
.ToList();
它将正常工作。
我个人比较喜欢这个符号:)
溶液变成了令人惊讶的简单: 而不是where m.WorkCrew.TodayStartTime() != null
在ASP.NET 1.1的核心,你应该使用where m.WorkCrew.TodayStartTime != null
唉!得到完全相同的错误:(似乎由于某种原因'm.WorkCrew'现在是空的!如果我第一次得到'var wcm = context.WorkCrewMembers.ToList()',然后有'wcm.Where(m => m.WorkCrew?.TodayStartTime())' - 我没有得到异常,但是我得到0行,就好像* all *'m.WorkCrew'为null – Felix
对不起,这看起来像是一个错误,我可以看看这个简单的代码片段是如何产生这种类型的错误的,在这里我们不应该编译以防万一有什么错误,我想你不会在你的类的某个地方进行一些隐藏的反射调用, –
谢谢。没有 - 在这里没有隐藏的魔法:) – Felix