【问题标题】:LINQ statement broke after upgrading to .NET Core 1.1 Preview 1升级到 .NET Core 1.1 Preview 1 后 LINQ 语句中断
【发布时间】:2016-11-08 09:07:34
【问题描述】:

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

未处理的异常:System.ArgumentException:在“WorkCrew”类型上声明的方法“System.Nullable`1[System.TimeSpan] TodayStartTime()”不能用“System.Int32”类型的实例调用

有趣的是,如果我这样做 from w in context.WorkCrew where w.TodayStartTime() != null select w 它工作正常。

这是 1.1 中的重大变化吗?还是因为我的代码不合法​​而应该更早抛出异常?或者只是微软将修复的错误?

【问题讨论】:

    标签: c# linq asp.net-core


    【解决方案1】:

    看来SelectWhere 的顺序在此LINQ 表示法中以某种方式颠倒了,您首先得到了返回ID 的选择。这就解释了为什么如果您选择项目本身而不是 Id 会起作用。

    我想如果你把它改成

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

    它会正常工作。

    我个人更喜欢这种表示法:)

    【讨论】:

    • 唉!得到完全相同的错误:(似乎由于某种原因m.WorkCrew现在为空!如果我先得到var wcm = context.WorkCrewMembers.ToList(),然后得到wcm.Where(m => m.WorkCrew?.TodayStartTime()) - 我没有得到异常,但我得到0行,好像 all m.WorkCrew 为空
    • 对不起,这看起来真的是一个错误,我看不出这个简单的 sn-p 是如何产生这种类型的错误的。如果这里出现问题,它甚至应该无法编译。我想你不会在你的类的某个地方做一些隐藏的反射调用。
    • 我不敢相信这里的 LINQ 一般有问题,可能会发生这里的 LINQ to EF 做了一些讨厌的技巧,你也可以尝试查看执行了哪个 SQL。不幸的是,我根本不是 EF 专家。
    【解决方案2】:

    解决方案非常简单: 而不是 ASP.NET Core 1.1 中的where m.WorkCrew.TodayStartTime() != null,您应该使用where m.WorkCrew.TodayStartTime != null

    【讨论】:

      猜你喜欢
      • 2018-08-03
      • 2017-07-05
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多